2016-09-21 4 views
0

Ich kämpfe derzeit auf ein Programm mit Java. Das Programm ist im Moment gut. Allerdings habe ich den kleinen Fehler. Für Fall 1 (Artikel hinzufügen) habe ich versucht, die Zeichenfolge mit Leerzeichen im Hersteller einzugeben. Das tritt der Fehler in Eclipse ähnlicheJava durch Eingabe in das Leerzeichen. InputMismatchException

Exception in thread "main" java.util.InputMismatchException 
at java.util.Scanner.throwFor(Unknown Source) 
at java.util.Scanner.next(Unknown Source) 
at java.util.Scanner.nextDouble(Unknown Source) 
at ass1.inventory.addItem(inventory.java:44) 
at ass1.inventory.run(inventory.java:28) 
at ass1.inventory.main(inventory.java:11) 

ich eine Menge Forschung für dieses Problem haben, wie das Hinzufügen Verwenden in.nextLine() statt in.next(), der Fehler kam noch heraus. Kann jemand das Problem für mich aufzeigen und das Problem beheben? Vielen Dank!!

Dies ist mein Code:

import java.util.Scanner; 

public class inventory { 

private static item[] inventory; 
static Scanner scanner = new Scanner(System.in); 
private static int noOfItems; 

public static void main(String[] args) { 
    noOfItems=0;   
    // TODO Auto-generated method stub 
    inventory=new item[5]; 
    run();  
} 
public static int displayMenu() 
{ 
    System.out.println("1.Add a product"); 
    System.out.println("2.Display a product"); 
    System.out.println("3.Quit"); 
    int i=scanner.nextInt(); 
    return i; 
} 
public static void run() 
{ 
    while(true) 
    { 
     int i=displayMenu(); 
     switch(i) 
     { 
     case 1:addItem(); 
       break; 
     case 2:findItem(); 
       break; 
     case 3:return; 
     default:System.out.println("Invalid choice"); 
     } 
    } 
} 
public static void addItem() 
{ 
    System.out.print("Enter Item name:"); 
    String item_name=scanner.next(); 
    System.out.print("Enter the manufacturer:"); 
    String manufacturer=scanner.next(); 
    System.out.print("Enter price:"); 
    double price=scanner.nextDouble(); 

    item b=new item(item_name,manufacturer,price); 
    if(noOfItems==inventory.length) 
     System.out.println("Array is full"); 
    else 
    { 
     inventory[noOfItems++]=b; 
     System.out.println("Item added successfully"); 
    } 
} 
public static void findItem() 
{ 
    System.out.print("Enter item name:"); 
    String item_name=scanner.next(); 
    for(int i=0; i<noOfItems; i++) 
    { 
     if(item_name(inventory[i].getItem_name())) 
     { 
      System.out.println("Item found:"); 
      System.out.print(inventory[i]+"\n"); 
      return; 
     }       
    }  
} 
} 

Dies ist eine weitere Datei zunächst eine Verbindung:

public class item { 

    private String item_name; 
    private String manufacturer; 
    private double price; 

    //To initialise the state of the object 
    public item(String item_name,String manufacturer,double price) 
    { 
    this.item_name=item_name; 
    this.manufacturer=manufacturer; 
    this.price=price; 
    } 
    //Reader methods i.e behavior methods 
    public String getItem_name() 
    { 
    return item_name; 
    } 
    public String getManufacturer() 
    { 
    return manufacturer; 
    } 
    public double getPrice() 
    { 
    return price; 
    } 
    //Writer methods or setter methods public void setTitle(String item_name) 
    { 
    this.item_name=item_name; 
    } 
    public void setManufact(String manufacturer) 
    { 
    this.manufacturer=manufacturer; 
    } 
    public void setPrice(double price) 
    { 
    if(price < 0) 
     System.out.println("Price cannot be negative"); 
    else 
     this.price=price; 
    } 
    public String toString() 
    { 
    return "Item name:"+item_name+"\nManufacturer:"+manufacturer+"\nPrice:"+price; 
    } 
} 

Antwort

0

Sie können das Problem auf vielfältige Weise lösen

Try scanner.useDelimiter(System.getProperty("line.separator")); am Anfang Hinzufügen von additem Methode.

0

Sie erhalten den Fehler, weil scanner.next() nur das nächste Token vor einem Leerzeichen einliest.

Nun, wenn ich Ihren Code ausführen würde, mit ein wenig Modifikation, um die Werte anzuzeigen. Wie unten.

System.out.print("Enter Item name:"); 
String item_name = scanner.next(); 
System.out.print("Enter the manufacturer:"); 
String manufacturer = scanner.next(); 
System.out.println("Manufacturer:" + manufacturer); //Print Manufacturer 
System.out.print("Enter price:"); 
double price = scanner.nextDouble(); 

Und wenn ich test test als Input für die Hersteller schreiben waren, nur test wird die Variable Hersteller zugeordnet werden. Die verbleibende Zeichenfolge im Puffer belassen. Wie das Ergebnis unten.

Enter Item name:test 
Enter the manufacturer:test test 
Manufacturer:test 
Enter price:Exception in thread "main" java.util.InputMismatchException 
    at java.util.Scanner.throwFor(Unknown Source) 
    at java.util.Scanner.next(Unknown Source) 
    at java.util.Scanner.nextDouble(Unknown Source) 
    at stackOverflowQns.inventory.addItem(inventory.java:50) 
    at stackOverflowQns.inventory.run(inventory.java:32) 
    at stackOverflowQns.inventory.main(inventory.java:15) 

Sie erwähnten scanner.nextLine() mit nicht funktioniert. Hier ist warum.

Da Sie Methoden wie scanner.next(), scanner.nextInt() usw. verwendet haben. Alle diese Methode wird Zeilentrennzeichen (\n) im Puffer verlassen. Wenn Sie anschließend scanner.nextLine() aufrufen, wird das, was vor dem Zeilentrennzeichen liegt, übernommen und Sie erhalten leere Zeichenfolgen. Und da siehst du solche Dinge.

Enter Item name:test 
Enter the manufacturer:Enter price: 

daher um Ihr Problem zu lösen, Sie müssen entweder ein scanner.nextLine() tun, bevor der Wert von dem Benutzer zu lesen, nur die Linie Separator löschen. Wie unten. Aber das ist nur hässlich, was ich nicht empfehlen kann.

System.out.print("Enter the manufacturer:"); 
scanner.nextLine(); 
String manufacturer = scanner.nextLine(); 

Oder wie das, was die andere Antwort vorgeschlagen, die nur zu setzen, ist die Linie Separator als Trennzeichen zu verwenden, damit die Lösung all die genannten Probleme.

Verwandte Themen