2015-09-27 83 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()工作,因为下一个值是“真”这不是有效的布尔