2016-04-12 3 views
-1

Я пытаюсь прочитать файл со сканером и получить некоторые переменные. Вот что файл выглядит следующим образом (игнорировать дополнительную строку между):Ошибка при чтении файла с помощью сканера

ControlType: 1

FIRE @ 541,0, 387,0

FIRE @ 252,0, 198,0

ПАНТ @ 522,0, 174,0

ПАНТ @ 268,0, 399,0

HERO @ 397,0, 287,0

Что мне нужно сделать, это получить тип управления и сохранить его, получить тип объекта (огонь и т. Д.), А затем получить координаты как плавающие. То, что я получил до сих пор, я думаю, это начало, но я не уверен, что понимаю ошибку, которая появляется. Я думаю, что это может иметь какое-то отношение к запятым между поплавками? Это мой код: (сканер считывает из строки «уровня», который содержит все содержимое файла Там нет необходимости для нового файла и т.д..)

// 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) 
+2

'@' не является допустимым поплавок. – Berger

+0

Исправлено это, добавив in.next(), все еще получая сообщение об ошибке – dj1121

ответ

1

вы получаете ошибку обусловленно у вас есть в вашем входе в @. Ваш метод nextFloat() получил это и попытался разобрать его как float, но не смог. Следовательно, вы видите исключение.

Одним из способов преодоления является то, что вы добавляете в свой код еще один 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)); 
} 
+0

Хмм, как я могу это использовать, а также получая поплавок? – dj1121

+0

Вам нужно удалить символ из любых значений, считываемых сканером. Прочитайте его как строку, а затем проанализируйте вручную. – ManoDestra

+0

Я пробовал распечатать x сразу после его сохранения, но кажется, что он не может получить. Я все еще получаю сообщение об ошибке. Кажется, что вызов in.nextFloat() вызывает ошибки, даже если я вызываю его после @ – dj1121

Смежные вопросы