2016-11-19 68 views
-1

首先,我希望用戶輸入一些東西(姓名,聯繫人,idnumber),我會顯示2個不同的文件,但代碼相同。第一個代碼問題是「名稱」輸入地方消失,但不會消失。任何人都可以告訴我這個問題嗎?相同的代碼,但不同的輸出

public class Admin { 
static Scanner scan= new Scanner(System.in); 
static Client client = new Client(); 
    public void admin(){ 
     newClient []nc = new newClient[10]; 
     \\login(); 
    while(true){ 
     System.out.println("Select 1:add Client\n 2:add Account\n 3:login as Client"); 
     try{ 
     int selection = scan.nextInt(); 
     switch(selection) 
     { 
     case 1: addClient(nc); 
       break; 
     case 2: \\addAccount(nc); 
       break; 
     case 3: ; 
       break; 
     default: System.out.println("INvalid selection"); 
     } 
     } 
     catch(InputMismatchException ex){ 
     System.out.println("Invalid input"); 
     scan.nextLine(); 
      } 
     }  
    } 
    public void addClient(newClient []nc){ 
    for(int i=0;i<nc.length;i++){ 
    System.out.println("Enter name"); 
    String name = scan.nextLine(); 
    System.out.println("Enter contact"); 
    String contact = scan.nextLine(); 
    System.out.println("Enter id number"); 
    String idNumber = scan.nextLine(); 
    nc[i]=new newClient(name,contact,idNumber); 
    System.out.println(nc[i]); 
    } 
    } 

的第一個代碼的輸出是

輸入姓名

輸入聯繫人

爲什麼叫輸入部位缺失? 還有第二個代碼

public static void main(String[]args){ 
    Scanner scan =new Scanner(System.in); 
    for(int i=0;i<nc.length;i++){ 
    System.out.println("Enter name"); 
    String name = scan.nextLine(); 
    System.out.println("Enter contact"); 
    String contact = scan.nextLine(); 
    System.out.println("Enter id number"); 
    String idNumber = scan.nextLine(); 
    nc[i]=new newClient(name,contact,idNumber); 
    System.out.println(nc[i]); 
    } 
    } 

第二個代碼工作正常。

輸入姓名

輸入聯繫人

輸入的ID號

回答

1

代碼的兩片實際上不同。

在第二個代碼中,scan對象是一個全新的對象。你唯一的方法是nextLine()。在第一個代碼中,scan對象創建了一個類級別,並且在調用addClient之前已經使用了

「已經使用」這裏非常重要。我的意思是你scan稱爲nextInt然後nextLine

int selection = scan.nextInt(); <-- You called nextInt here! 
    switch(selection) 
    { 
    case 1: addClient(nc); 
      break; 
    case 2: \\addAccount(nc); 
      break; 
    case 3: ; 
      break; 
    default: System.out.println("INvalid selection"); 
    } 
    } 
    catch(InputMismatchException ex){ 
    System.out.println("Invalid input"); 
    scan.nextLine(); 
     } 
    }  
} 
public void addClient(newClient []nc){ 
    for(int i=0;i<nc.length;i++){ 
     System.out.println("Enter name"); 
     String name = scan.nextLine(); <-- then you called nextLine here! 
     System.out.println("Enter contact"); 
     String contact = scan.nextLine(); 
     System.out.println("Enter id number"); 
     String idNumber = scan.nextLine(); 
     nc[i]=new newClient(name,contact,idNumber); 
     System.out.println(nc[i]); 
    } 
} 

這使得nextLine方法返回一個空字符串。

爲什麼?

讓我們來看看documentation兩個nextIntnextLine

nextInt()

掃描輸入作爲一個int的下一個標記。

nextLine()

此掃描器的當前行,並返回跳過的輸入。

我創建再現這種情況解釋爲什麼調用簡單的代碼nextLinenextInt後可能會導致問題:

Scanner s = new Scanner(System.in); 
s.nextInt(); 
System.out.println(s.nextLine()); 

我會用一個|字符表示了掃描儀的當前位置。

程序啓動時,

| 

然後我輸入號碼20:

​​

現在掃描器讀取20,根據documetation,掃描儀應該是在這個位置:

20| 

這裏有趣的部分,nextLine「Advances this scanner超過當前行並返回跳過的輸入。「

20 
| 

那麼掃描器跳過了什麼輸入?沒有!結果,返回一個空字符串。

+0

謝謝你的明確解釋,我學到了新的東西。 –

0

ΦXocę 웃 Пepeúpa ツscan.nextInt難道不讀enter


這樣的替代解決方案是前讀取name contact id信息,採用scan.nextLine()讀取enter這樣的:

public void addClient(newClient []nc){ 
    scan.nextLine(); 
    for(int i=0;i<nc.length;i++){ 
     ....// your origin code 
    } 
相關問題