使用扫描仪读取文件时出错

时间:2016-04-12 13:11:28

标签: java file java.util.scanner

我试图用扫描仪读取文件并获取一些变量。这是文件的样子(忽略其间的额外线):

ControlType:1

FIRE @ 541.0,387.0

FIRE @ 252.0,198.0

PANT @ 522.0,174.0

PANT @ 268.0,399.0

HERO @ 397.0,287.0

我需要做的是获取控件类型并存储它,获取对象类型(fire等),然后将坐标作为浮点数。到目前为止,我认为这是一个开始,但我不确定我是否理解弹出的错误。我想它可能与花车之间的逗号有关?这是我的代码:(扫描程序正在读取字符串" level"其中包含文件的所有内容。不需要新文件等。)

// Create a scanner
    Scanner in = new Scanner(level);
    // Move past initial text
    in.next();
    // Get control type
    int controlType = in.nextInt();

    // While there is something to read
    while (in.hasNextLine()) {
        String a = in.next();
        System.out.println(a);

        if (a.equals("FIRE")) {
            in.next();
            float x = in.nextFloat();
            float y = in.nextFloat();
            fires.add(new Fire(x, y, randGen));
        } else if (a.equals("HERO")) {
            in.next();
            float x = in.nextFloat();
            float y = in.nextFloat();
            hero = new Hero(x, y, controlType);
        } else if (a.equals("PANT")) {
            in.next();
            float x = in.nextFloat();
            float y = in.nextFloat();
            pants.add(new Pant(x, y, randGen));
        }
    }

这是输出:

FIRE

然后是这些错误:

Exception in thread "Animation Thread" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextFloat(Unknown Source)
    at Game.loadLevel(Game.java:184)
    at Game.<init>(Game.java:53)
    at Application.setup(Application.java:90)
    at processing.core.PApplet.handleDraw(PApplet.java:2373)
    at processing.awt.PSurfaceAWT$12.callDraw(PSurfaceAWT.java:1523)
    at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:316)

1 个答案:

答案 0 :(得分:1)

由于输入中有@,您会收到错误消息。你的nextFloat()方法得到了它,并尝试将其解析为浮点数,但失败了。因此,您会看到异常。

要克服的一种方法是,在代码中添加另一个in.next(),以使用@

例如:

while(in.hasNextLine()){
    String a = in.next();
    System.out.println(a);
    in.next();  //consume the @
    //rest of code

修改

你说你仍然得到例外。这是因为您的号码以,分隔。你也需要消费它。

您可以通过以下方式执行此操作:

if(a.equals("FIRE")){
    in.next();// for @
    String num[] = in.nextLine().split(",");
    float x = Float.parseFloat(num[0].trim());
    float y = Float.parseFloat(num[1].trim());
    fires.add(new Fire(x, y, randGen));
}