java - 尝试读取 boolean 输入时扫描仪发生 InputMismatchException 错误

标签 java java.util.scanner

下面的 Java 代码带有一个 readFile() 方法,该方法是使用 Scanner 实现的,用于逐行读取文件并将其分成五个不同的对象,但是当它到达 boolean 输入时,它会抛出 InputMismatchException 错误。是什么导致了这个错误?我尝试了一些不同的方法,我只是将 usedelimiter(",") 添加到扫描仪中,这导致了此错误,但在使用分隔符之前,它没有关闭 扫描仪。我做错了什么?

我的文件数据如下所示:

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)

最佳答案

让我们看看文件的第一行:

Chevy, Malibu, 1999, 10000, true,

如您所见,最后一个字符是:,
现在让我们看看您的分隔符:scCars.useDelimiter(", ");。正如您所看到的,它需要一个逗号一个空格。因此,我们知道文件每行的最后一个逗号不是有效的分隔符。因此,扫描仪将读取 true,(或 false,),而不是 true(或 false)。

要解决此问题,请将分隔符更改为 scCars.useDelimiter(",\\s*"); 以接受逗号和任意数量的空格。如果您不想拆分具有多个空格的文本,也可以使用 scCars.useDelimiter(",\\s?");

顺便说一句:您还有另一个问题:您没有正确处理最后一个文件行“end”,但这是另一个问题。

关于java - 尝试读取 boolean 输入时扫描仪发生 InputMismatchException 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32809603/

相关文章:

java - 遇到变量无法打印和\n 无法工作的问题

Java while 循环在与 scan.nextLine() 交互后终止;方法

java - 扫描从文件读取的行的有效方法

java - 属性访问异常 : could not get a field value by reflection getter While using Hibernate

java - 通过避免创建对象进行优化

java - 如何正确停止线程?

eclipse - Eclipse 如何只使用 JRE 编译类?

java - Kotlin 中的 Java Scanner 相当于什么?

java - 为什么我的代码退出并且不接受扫描仪拉入的 "yes"或硬编码的代码?

java - 如何在java中制作流畅的动画而不是口吃