2016-11-19 4 views
-1

Zuerst möchte ich Benutzer etwas eingeben (Name, Kontakt, Idnumber), und ich werde 2 verschiedene Datei zeigen, aber Code sind gleich. Das erste Code-Problem ist "Name" Eingang Ort verschwinden, und die zweite aber verschwindet nicht.Kann mir jemand das Problem sagen? Ich bin neu in Java.Gleicher Code, aber unterschiedliche Ausgabe

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]); 
    } 
    } 

Ausgang des ersten Codes ist

Namen eingeben

eingeben Kontakt

Warum der Name Eingabe Ort fehlt? Es gibt den zweiten Code

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]); 
    } 
    } 

Der zweite Code korrekt funktioniert.

Geben Sie den Namen

Kontakt Geben Sie

Geben Sie IDNumber

Antwort

1

Die beiden Teile des Codes sind in der Tat anders.

Im zweiten Code ist das Objekt ein brandneues Objekt. Und die einzige Methode, die Sie anrufen, ist nextLine(). Im ersten Code wird das scan Objekt eine Klassenstufe erstellt, und wurde verwendet, bevor addClient aufgerufen wird.

"Wurde verwendet" hier ist sehr wichtig. Damit meine ich Sie nextInt auf scan genannt und dann 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]); 
    } 
} 

Dies macht die nextLine Methode einen leeren String zurück.

Warum?

die am documentation sowohl Werfen wir einen Blick für nextInt und nextLine:

nextInt()

das nächste Token des Eingangs als int-Scans.

nextline()

Advances diesen Scanner über die aktuelle Zeile und gibt die Eingabe, die übersprungen wurde.

Ich habe einen einfacheren Code erstellt, die diese Situation warum nextLine sofort Aufruf zu erklären, reproduziert nach nextInt kann zu Problemen führen:

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

Ich werde ein | Zeichen verwenden zu bezeichnen, wo der aktuelle Position des Scanners ist.

Wenn das Programm startet,

| 

Dann gebe ich die Nummer 20:

|20 

Jetzt ist der Scanner liest die 20, nach der-Dokumentation über, sollte der Scanner an dieser Stelle sein:

20| 

Hier kommt der interessante Teil, nextLine "Fortschritte dieser Scanner hinter der aktuellen Zeile und gibt die übersprungene Eingabe zurück. "

20 
| 

Also welchen Eingang hat der Scanner übersprungen? Nichts! Als Ergebnis wird eine leere Zeichenfolge zurückgegeben.

+0

Vielen Dank für Ihre klare Erklärung, ich habe etwas Neues gelernt. –

0

als ΦXocę 웃 Пepeúpa ツ sagt scan.nextInt die enter lesen würde nicht.


so eine alternative Lösung vor name contact id Informationen lesen, verwenden scan.nextLine() die enter wie folgt zu lesen:

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