2017-03-22 5 views
0

Mein Scanner liest aus einer Textdatei mit einem Trennzeichen. Wenn ich jedoch das Programm austrage, ist die einzige Zeile, die ausgedruckt wird, die erste Datenzeile. Dann wird eine Ausnahme für die Eingabeübereinstimmung ausgelöst. Ich glaube der Fehler ist, dass es nicht in die nächste Zeile geht. Ich verstehe, wie das Missverhältnis funktioniert. Ich bin mir nur nicht sicher, wie ich es beheben kann. Ich habe versucht, scanner.nextLine() zu setzen; in, wie Sie in meinem Code unten sehen können.Scanner Mismatch Ausnahme beim Lesen von Textdatei

Hier ist mein Code für den Scanner:

/** 
* Method for reading the data from the electricToolData.txt file. 
*/ 
public void readElectricToolData() 
{ 
    Frame myFrame = null; // initialises frame to null 
    FileDialog fileBox = new FileDialog(myFrame, 
       "Open", FileDialog.LOAD); 
    fileBox.setVisible(true); 

    String directoryPath = fileBox.getDirectory(); 
    String filename = fileBox.getFile(); 

    System.out.println(filename + " " + directoryPath); // prints out name of file and directory path 


    try { 
    File dataFile = new File(filename); 
    Scanner scanner = new Scanner(dataFile); 

    while(scanner.hasNext()) 
    { 
     String lineOfText = scanner.nextLine(); // reads the next line of the file and stores as String 

     //if statement checks if line starts with either "//" or space. 
     if (lineOfText.startsWith("//") || lineOfText.isEmpty()) 
     { 

         } 
     else // now got real data 
     { 

     Scanner scanner2 = new Scanner(lineOfText); 
     scanner2.useDelimiter(","); 
     lineOfText.trim(); 
     System.out.println(lineOfText); 


      while(scanner2.hasNext()) 
      { 
      //lineOfText.trim(); 
      boolean mRechargeable = scanner.nextBoolean(); 
      String mPower = scanner.next(); 
      String mToolName = scanner.next(); 
      String mItemCode = scanner.next(); 
      int mTimesBorrowed = scanner.nextInt(); 
      boolean mOnLoan = scanner.nextBoolean(); 
      int mCost = scanner.nextInt(); 
      int mWeight = scanner.nextInt(); 
      scanner.nextLine(); 



      ElectricTool electricTool = new ElectricTool(mToolName, mItemCode, mTimesBorrowed, mCost, mWeight, mPower); 
      toolsList.add(electricTool); 

     } 

     } 





     //System.out.println(lineOfText); // prints out string 
    } 
    scanner.close(); 
    scanner.close(); // closes scanner 


    } 
     catch(FileNotFoundException e) 
    { 
     System.err.println("Caught IOException: " + e.getMessage()); 
    } 

    } 

Der Fehler bei der boolean gezeigt wird mRechargeable = scanner.nextBoolean() ;.

Hier ist die Datendatei:

// this is a comment, any lines that start with // 
// (and blank lines) should be ignored 

// data is rechargeable, power, toolName, itemCode, timesBorrowed, onLoan, cost, weight 
true,18V,Makita BHP452RFWX,RD2001,12,false,14995,1800 
true,10.8V,Flex Impact Screwdriver FIS439,RD2834,14,true,13499,1200  
false,1350W,DeWalt D23650-GB Circular Saw, RD6582,54,true,14997,5400 
false,1500W,Milwaukee DD2-160XE Diamond Core Drill,RD4734,50,false,38894,9000 
true,10.8V,Bosch GSR10.8-Li Drill Driver,RD3021,25,true,9995,820 
false,900W,Bosch GSB19-2REA Percussion Drill,RD8654,85,false,19999,4567 
true,10.8V,Flex Impact Screwdriver FIS439, RD2835,14,false,13499,1200 
true,18V,DeWalt DW936 Circular Saw,RD4352,18,false,19999,3300 
false,2100W,Sparky FK652 Wall Chaser,RD7625,15,false,29994,8400 

Antwort

0

Das Problem ist, dass String.trim() Sie denken, nicht die Art und Weise funktioniert es nicht: es ist nicht den String nicht mutiert es auf genannt wird, aber gibt einen neuen String zurück, der den Whitespace entfernt hat. Dies führt dazu, dass die Zeile nicht getrimmt wird und dass die "Leerzeile", die viele Leerzeichen enthält, nicht mit dem ersten scanner.nextBoolean() -Aufruf analysiert wird.

So Update:

String lineOfText = scanner.nextLine(); // reads the next line of the file and stores as String 

sein:

// read the next line of the file, removing enclosing whitespace 
String lineOfText = scanner.nextLine().trim(); 

Kommentare sollten idealerweise die Zeile vorangestellt werden, da sie einfacher zu lesen und das Format ist, und mehr offensichtlich, dass es ein Kommentar. Entfernen Sie auch die redundante Zeile von Text.trim(); später im Code.

Denken Sie außerdem daran, alle Scanner-Instanzen zu schließen, wenn Sie fertig sind (also hier eine für jede Zeile und eine für die Datei).

Das nächste Problem ist, dass in der inneren Schleife, wo Sie Ihre ElectricTool Instanzen konstruieren, Sie Methoden auf Scanner anrufen, anstatt scanner2 (die semantischen, zB itemScanner etwas umbenennen):

Scanner itemScanner = new Scanner(lineOfText); 
itemScanner.useDelimiter(","); 

boolean mRechargeable = itemScanner.nextBoolean(); 
String mPower = itemScanner.next(); 
String mToolName = itemScanner.next(); 
String mItemCode = itemScanner.next(); 
int mTimesBorrowed = itemScanner.nextInt(); 
boolean mOnLoan = itemScanner.nextBoolean(); 
int mCost = itemScanner.nextInt(); 
int mWeight = itemScanner.nextInt(); 
+0

I fühle mich so dumm, jetzt hast du erwähnt, dass ich den ersten Scanner anstelle des zweiten Scanners benutzt habe. Danke für die Antwort, der Code funktioniert jetzt einwandfrei! –

+0

Es gibt keine dummen Fragen - wir alle haben solche Fehler in der Vergangenheit gemacht, und ich bin mir sicher, dass ich das auch in Zukunft tun werde! –

Verwandte Themen