0

I have the Java code below with a readFile() method that I've implemented with a Scanner to read a file line by line and separate into five different objects, but when it gets to the boolean input it throws an InputMismatchException error. What's causing this error? I've tried a few different things, I just added the usedelimiter(",") to the scanner which has caused this error, but before using the delimiter, it wasn't closing the Scanner. What am I doing wrong?

My file data looks like this:

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

and my method looks like this:

//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();                    
}

Here's the full stacktrace:

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)
1
  • Post a complete example reproducing the problem, along with the input file, and the stack trace of the exception. Commented Sep 27, 2015 at 15:45

3 Answers 3

1

Let's look at the first line of your file:

Chevy, Malibu, 1999, 10000, true,

As you can see, the very last character is: ,.
Now let's look at your delimiter: scCars.useDelimiter(", ");. As you can see it expects a comma and a whitespace. So, we know that the last comma on each line of your file is not a valid delimiter. Therefore, the scanner will read true, (or false,) instead of true (or false).

To fix that, change your delimiter to scCars.useDelimiter(",\\s*"); to accept a comma and any amount of whitespaces. You could also use scCars.useDelimiter(",\\s?"); if you don't want to split on a text with more more than one whitespace.

Btw: you have another problem: you don't handle the last file line "end" correctly, but this is another question.

Sign up to request clarification or add additional context in comments.

1 Comment

Correct. The last character sequence of each line in his file is ",\n" which fails to match to ", "
1

This happening because last part in each line just have , not ,<whitespace>, which you have specified in your scanner delimiter. I would suggest you to make the following changes.

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

you can use the regex for handling it. The regex for handling zero or more white space is ,\\s* along with one comma. Then you need to make only one chage to your delimiter.

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

Comments

0

Its a problem of your data set format and your delimiter.

You can just remove the spaces after ',' and use

sc. useDelimiter(',');

Just make sure that whatever delimiter you are using, the separated values are of exact format which are expected by the type you are asking from Scanner

e.g.

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

In your case sc.nextBoolean() is Not working because next value is 'true,' which is not a valid boolean

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.