Weird NumberFormatException, которое не должно появляться?

привет всем хорошо, у меня есть этот код:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ItemIdReader {
 public int id;
 public ItemIdReader(){

 try {
 BufferedReader br = new BufferedReader(new FileReader("itemList.txt"));
 String line = br.readLine();
 while (true) {
 if (line == null)
 break;

 String[] split = line.split(" - ", 2);

 String itemName = split[1];
 id= Integer.parseInt(split[0]);
 }
 } catch (IOException i ) {

 i.printStackTrace();
 }
 }

 public int getId() {
 return id;
 }
}

и когда я пытаюсь вывести id, я получаю эту ошибку:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "1"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at ItemIdReader.<init>(ItemIdReader.java:19)
at Launcher$UI.lambda$new$0(Launcher.java:25)
at Launcher$UI$$Lambda$1/455659002.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
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.awt.EventQueue.dispatchEvent(EventQueue.java:714)
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)
</init>

вот файл.txt im, читающий из:

1 - Toolkit

и вот распечатка:

ItemIdReader newF= new ItemIdReader();
 System.out.println(newF.getId());

Как вы можете видеть, я уже сделал значение id целочисленным, но все равно получаю, что он говорит о своей строке, когда я пытаюсь ее вывести, спасибо.

4 ответа

Прежде всего, если бы у вас не было этого исключения, у вас был бы бесконечный цикл.

Я предполагаю, что у вас есть скрытый персонаж, возможно, спецификация, в начале вашего файла. Подтвердите это, сбросив каждый символ как целое число, и если оно подтвердится, затем снова откройте файл с помощью редактора и обязательно сохраните его без спецификации.

for (char c : split[0].toCharArray()) {
 System.out.println((int) c); 
}


Это бесконечный цикл! вы должны прочитать строку снова внутри. Этот код похож на то, что вы хотите сделать, и он работает для меня:

public class Test {
 public static void main(String[] a) throws IOException{
 BufferedReader br = new BufferedReader(new FileReader("itemList.txt"));
 String line = br.readLine();
 while (true) {
 if (line == null)
 break;
 String[] split = line.split(" - ", 2);
 String itemName = split[1];
 int id= Integer.parseInt(split[0]);
 System.out.println(id);
 line = br.readLine();
 }
 }
}


JB Nizet прав. На самом деле есть знак байтового заказа, он скопирован в сообщение об ошибке.

Вы можете прочитать файл, используя BOMInputStream, чтобы избежать этого.


Если вы перемещаете readln внутри цикла, он отлично работает

while (true) { 
String line = br.readLine();

 if (line == null)
 break;

 String[] split = line.split(" - ", 2);

 String itemName = split[1];
 id= Integer.parseInt(split[0]);
 }

licensed under cc by-sa 3.0 with attribution.