2015-09-27 60 views
0

我有下面的Java代碼,我用Scanner實現了一個readFile()方法來逐行讀取文件,並將其分爲五個不同的對象,但是當它到達boolean輸入它會拋出一個InputMismatchException錯誤。什麼導致這個錯誤?我嘗試了一些不同的東西,我只是將usedelimiter(",")添加到造成此錯誤的掃描儀,但在使用分隔符之前,它並未關閉Scanner。我究竟做錯了什麼?當嘗試讀取布爾輸入時掃描器InputMismatchException錯誤

我的文件中的數據是這樣的:

Chevy, Malibu, 1999, 10000, true, 
Ford, Focus, 2001, 5000, false, 
Porshe, Carrera, 1995, 35000, true, 
Honda, Insight, 2014, 18000, true, 
Hyundai, Elantra, 1998, 9000, true, 
end 

,我的方法是這樣的:

//scan the identified file to separate the different data streams 
while(scCars.hasNextLine()){ 
    index++; 
    scCars.useDelimiter(", "); 

    if(scCars.hasNext()){ 
     //pull out the first string and set it as this car's make 
     make = scCars.next(); 
      c.setMake(make);    

     //pull out the second string and set it as this car's model  
     model = scCars.next(); 
      c.setModel(model); 

     //pull out the first int and set it as this car's year  
     year = scCars.nextInt(); 
      c.setYear(year); 

     //pull out the first double and set it as this car's price  
     price = scCars.nextDouble(); 
      c.setPrice(price); 

     //pull out the first boolean and set it as this car's happy  
     happy = scCars.nextBoolean(); 
      c.setHappy(happy); 
     } 
     //add them all to the arraylist as this car object  
     c.carList.add(new CarA(c.getMake(), c.getModel(), c.getYear(), c.getPrice(), c.getHappy()));    
    } 
    scCars.close();      
} 

下面是完整的堆棧跟蹤:

Exception in thread "AWT-EventQueue-0" java.util.InputMismatchException 
at java.util.Scanner.throwFor(Scanner.java:864) 
at java.util.Scanner.next(Scanner.java:1485) 
at java.util.Scanner.nextBoolean(Scanner.java:1782) 
at cara.CarGui.readFile(CarGui.java:256) 
at cara.CarGui$1.actionPerformed(CarGui.java:191) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6525) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
at java.awt.Component.processEvent(Component.java:6290) 
at java.awt.Container.processEvent(Container.java:2234) 
at java.awt.Component.dispatchEventImpl(Component.java:4881) 
at java.awt.Container.dispatchEventImpl(Container.java:2292) 
at java.awt.Component.dispatchEvent(Component.java:4703) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462) 
at java.awt.Container.dispatchEventImpl(Container.java:2278) 
at java.awt.Window.dispatchEventImpl(Window.java:2739) 
at java.awt.Component.dispatchEvent(Component.java:4703) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746) 
at java.awt.EventQueue.access$400(EventQueue.java:97) 
at java.awt.EventQueue$3.run(EventQueue.java:697) 
at java.awt.EventQueue$3.run(EventQueue.java:691) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86) 
at java.awt.EventQueue$4.run(EventQueue.java:719) 
at java.awt.EventQueue$4.run(EventQueue.java:717) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:716) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 
+0

後一個完整的例子重現問題,一起與輸入文件以及異常的堆棧跟蹤。 –

回答

1

讓我們來看看第一線您的檔案:

雪佛蘭,馬里布,1999,10000,真實,

正如你所看到的,最後一個字符是:,
現在讓我們看看您的分隔符:scCars.useDelimiter(", ");。正如你所看到的,它需要一個逗號一個空格。所以,我們知道文件每行的最後一個逗號是而不是的有效分隔符。因此,掃描儀將讀取true,(或false,)而不是true(或false)。

要解決該問題,請將您的分隔符更改爲scCars.useDelimiter(",\\s*");以接受逗號和任意數量的空格。如果您不想在具有多於一個空格的文本上進行拆分,也可以使用scCars.useDelimiter(",\\s?");

順便說一句:你有另一個問題:你沒有正確處理最後一個文件行「end」,但這是另一個問題。

+0

正確。他文件中每行的最後一個字符序列是「,\ n」,它不能與「,」匹配 – cjcroix

1

發生這種情況是因爲每行中的最後一部分只有,而不是,<whitespace>,這是您在掃描程序分隔符中指定的。我建議你做出以下更改。

scCars.useDelimiter(","); 

make = scCars.next().trim(); 
model = scCars.next().trim(); 
year = Integer.parseInt(scCars.next().trim()); 
price = Double.parseDouble(scCars.next().trim()); 
happy = Boolean.parseBoolean(scCars.next().trim()); 

OR

可以使用regex處理它。處理零個或多個空白區域的正則表達式是,\\s*以及一個逗號。那麼你只需要對你的分隔符只做一個chage。

scCars.useDelimiter(",\\s*"); 
0

它是您的數據集格式和您的分隔符的問題。

您只需刪除空格後「」並使用

sc. useDelimiter(','); 

只要確保任何分隔符您正在使用,分離出的值是它是由您從詢問類型要求的確切格式掃描儀

例如

sc.nextInt() must have an int to return 
sc.nextBoolean() must have a boolean to return 

在你的情況sc.nextBoolean()工作,因爲下一個值是「真」這不是有效的布爾