2008-11-20 13 views
13
File fil = new File("Tall.txt"); 
FileReader inputFil = new FileReader(fil); 
BufferedReader in = new BufferedReader(inputFil); 

int [] tall = new int [100]; 

String s =in.readLine(); 

while(s!=null) 
{ 
    int i = 0; 
    tall[i] = Integer.parseInt(s); //this is line 19 
    System.out.println(tall[i]); 
    s = in.readLine(); 
} 

in.close(); 

Próbuję użyć pliku "Tall.txt" do zapisania liczb całkowitych w nich zawartych w tablicy o nazwie "tall". Czyni to w pewnym stopniu, ale również wtedy, gdy go uruchomić, to rzuca następujący wyjątek (?:Java: Odczytywanie liczb całkowitych z pliku do tablicy

Exception in thread "main" java.lang.NumberFormatException: For input string: "" 
    at java.lang.NumberFormatException.forInputString(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at BinarySok.main(BinarySok.java:19) 

Dlaczego dokładnie to to zrobić, i jak mogę usunąć go jak ja to widzę, czytam plik jako ciągi, a następnie przekonwertować go do int, który nie jest nielegalne

+0

BTW, należy zadeklarować "i" na zewnątrz pętli while. jeśli nie, zawsze wstawisz ints do indeksu 0 twojej tablicy. –

+1

BTW, komentarz "to jest linia 19" jest kandydatem do "Najlepszego komentarza w historii". Z jakiego IDE korzystasz? –

+0

Nie mam zielonego pojęcia, jak to się stało. Chyba wziąłem gdzieś część kodu i najwyraźniej pojawiły się komentarze. – Northener

Odpowiedz

9

musisz mieć pustą linię w pliku

Możesz owinąć połączeń parseInt w „try” bloku..:

try { 
    tall[i++] = Integer.parseInt(s); 
} 
catch (NumberFormatException ex) { 
    continue; 
} 

Lub s sugerować czek na pustych strunach przed parsowania:

if (s.length() == 0) 
    continue; 

Należy pamiętać, że inicjowanie indeks zmiennej i wewnątrz pętli, to zawsze 0. Należy przesunąć oświadczenia przed pętlą while. (Lub sprawiają, że jest częścią pętli for.)

+1

najprawdopodobniej jest to LAST linii pliku. –

2

Wygląda na to, że Java próbuje przekonwertować pusty ciąg na liczbę. Czy masz pustą linię na końcu serii liczb?

Można prawdopodobnie naprawić kod podobny do tego

String s = in.readLine(); 
int i = 0; 

while (s != null) { 
    // Skip empty lines. 
    s = s.trim(); 
    if (s.length() == 0) { 
     continue; 
    } 

    tall[i] = Integer.parseInt(s); // This is line 19. 
    System.out.println(tall[i]); 
    s = in.readLine(); 
    i++; 
} 

in.close(); 
1

Można mieć nieporozumień pomiędzy różnymi zakończeniami linii. Plik systemu Windows zakończy każdą linię znakiem powrotu karetki i wierszem. Niektóre programy w systemie Unix odczytają ten plik tak, jakby miał on dodatkową pustą linię między wierszami, ponieważ zobaczy powrót karetki jako koniec linii, a następnie zobaczy wiersz jako kolejny koniec linii.

+1

Nie, nie ma znaczenia, na jakiej platformie działa aplikacja, BufferedReader zawsze sprawdza wszystkie trzy rodzaje separatorów liniowych: \ r \ n (carriage-return + linfeed), \ n (tylko wiersz) i \ r (tylko powrót karetki). –

40

Możesz chcieć zrobić coś takiego (jeśli jesteś w Javie 5 & up)

Scanner scanner = new Scanner(new File("tall.txt")); 
int [] tall = new int [100]; 
int i = 0; 
while(scanner.hasNextInt()){ 
    tall[i++] = scanner.nextInt(); 
} 
+4

Co zrobić, jeśli nie wiesz, ile jest liczb całkowitych? – Vanuan

+5

@Vanuan: 'java.util.ArrayList' –

3

Dla porównania, tutaj jest inny sposób odczytać pliku. Ma jedną zaletę, że nie musisz wiedzieć, ile liczb całkowitych znajduje się w pliku.

File file = new File("Tall.txt"); 
byte[] bytes = new byte[(int) file.length()]; 
FileInputStream fis = new FileInputStream(file); 
fis.read(bytes); 
fis.close(); 
String[] valueStr = new String(bytes).trim().split("\\s+"); 
int[] tall = new int[valueStr.length]; 
for (int i = 0; i < valueStr.length; i++) 
    tall[i] = Integer.parseInt(valueStr[i]); 
System.out.println(Arrays.asList(tall)); 
0
File file = new File("E:/Responsibility.txt"); 
    Scanner scanner = new Scanner(file); 
    List<Integer> integers = new ArrayList<>(); 
    while (scanner.hasNext()) { 
     if (scanner.hasNextInt()) { 
      integers.add(scanner.nextInt()); 
     } else { 
      scanner.next(); 
     } 
    } 
    System.out.println(integers); 
Powiązane problemy