2008-11-20 24 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(); 

Estoy intentando usar el archivo "Tall.txt" para escribir los enteros contenidos en ellos en la matriz llamada "alto". Lo hace, en cierta medida, sino también cuando lo ejecuto, se lanza la siguiente excepción (?:Java: Lectura de enteros de un archivo en una matriz

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) 

Por qué exactamente lo que hace esto, y cómo puedo eliminarla Tal como lo veo, leo la presentar como cadenas, y luego convertirlo a enteros, lo que no es ilegal

+0

Por cierto, usted debe declarar la "i" fuera del bucle while. si no, siempre insertarás las entradas en el índice 0 de tu matriz. –

+1

Por cierto, el comentario "esta es la línea 19" es un candidato para "Mejor comentario visto". ¿Qué IDE estás usando? –

+0

No tengo ni idea de cómo llegó allí. Creo que tomé partes del código de algún lado, y aparentemente aparecieron los comentarios. – Northener

Respuesta

9

debe tener una línea vacía en su archivo

es posible que desee para envolver sus llamadas parseInt en un bloque de "tratar"..:

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

O s implicaría cheque por cadenas vacías antes de analizar:

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

Nótese que al inicializar el índice de variables i dentro del bucle, siempre es 0. Debe moverse la declaración antes del bucle while. (O hágalo parte de un bucle for)

+1

con toda probabilidad, es la ÚLTIMA línea del archivo. –

2

Parece que Java está intentando convertir una cadena vacía en un número. ¿Tienes una línea vacía al final de la serie de números?

Probablemente se podría solucionar el código como este

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

Es posible que tenga confusiones entre los diferentes finales de línea. Un archivo de Windows terminará cada línea con un retorno de carro y un avance de línea. Algunos programas en Unix leerán ese archivo como si tuviera una línea en blanco adicional entre cada línea, porque verá el retorno del carro como un final de línea, y luego verá el avance de línea como otro final de línea.

+1

No, no importa en qué plataforma se ejecute la aplicación, BufferedReader siempre comprueba los tres tipos de separador de línea: \ r \ n (retorno de carro + linfeed), \ n (avance de línea solamente) y \ r (transporte de regreso solamente). –

40

Es posible que desee hacer algo como esto (si estás en Java 5 & arriba)

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

¿Qué sucede si no sabes cuántos enteros hay? – Vanuan

+5

@Vanuan: 'java.util.ArrayList' –

3

Para la comparación, aquí es otra manera de leer el archivo. Tiene una ventaja de que no necesita saber cuántos enteros hay en el archivo.

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); 
Cuestiones relacionadas