2011-09-03 7 views
7

Estoy tratando de importar texto de un archivo de texto que se ha generado en otro Activity. El archivo de texto generado se compone de un StringArrayList que sólo contiene números y el otro texto aleatorio generado por Android. Cuando importo el texto del archivo que estoy usando un BufferedReader y readLine() para obtener cada nuevo número en un IntegerArrayList. Elimino cualquier valor no numérico del archivo de texto y los números que se generan en la otra Actividad se dividen en "\ n".El estrellarse debido a Integer.parseInt

El problema que estoy enfrentando es que Android se bloquea cuando se carga el Activity. Reduje la causa al Integer.parseInt().

Mi código es el siguiente:

ArrayList<Integer> lines = new ArrayList<Integer>(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     File file = new File(getFilesDir(), "test_file.txt"); 

     try { 
      BufferedReader br = new BufferedReader(new FileReader(file)); 
      while (br.readLine() != null) { 
       String text = (br.readLine()).replaceAll("[^0-9]+","").trim(); 
       Integer number = Integer.parseInt(text); 
       lines.add(number); 
      } 
     } catch (IOException e) { 

     } 

     TextView tv = (TextView) findViewById(R.id.helptext); 

     int max = 0, min = 100; 
     double total = 0; 
     for (int i = 0; i < lines.size(); i++) { 
      int number = lines.get(i); 
      max = Math.max(max, number); 
      min = Math.min(min, number); 
      total += number; 
     } 

     tv.setText("max = " + max + " min = " + min + " total = " 
       + total); 

Respuesta

10

Problemas:

  • Al hacer replaceAll("[^0-9]+","") se puede acabar con una cadena vacía causando Integer.parseInt a lanzar una NumberFormatException.

  • va a omitir cada dos líneas (su condición de bucle while consume la primera línea, la tercera línea y así sucesivamente ...)

    while (br.readLine() != null) // consumes one line 
    

intentar algo como esto:

BufferedReader br = new BufferedReader(new FileReader(file)); 
String input; 
while ((input = br.readLine()) != null) { 
    String text = input.replaceAll("[^0-9]+",""); 
    if (!text.isEmpty()) 
     lines.add(Integer.parseInt(text)); 
} 
+0

IT WORKS !!!!!! Tuve que cambiar text.isEmpty() a text.length() == 0 porque estoy usando una API de Android anterior, ¡pero FUNCIONA! MUCHAS GRACIAS DACWE! – BGM

+1

@Arjan: disculpa por eso, leí la ayuda sobre cómo responder en comentarios pero dejé accidentalmente el símbolo "@". Además, lo siento mucho por el tee, realmente no esperaba que causara tantos problemas. Había pasado tanto tiempo tratando de solucionar el problema y estaba tan feliz cuando lo resolví que no pude agradecerle lo suficiente. Te aseguro que no volverá a suceder. Por cierto, tengo que decir que stackoverflow es uno de los mejores, si no el mejor, sitios para soluciones de código en Internet. Si eres uno de los tipos que ayudaron a configurarlo, ¡muchas gracias! – BGM

+1

@BGM, la camiseta para dacwe no es un problema, si lees [esto] (http://meta.stackexchange.com/questions/104959/gift-reward-offered-after-accepting-an-answer). Nota final, '' Stack Overflow le gusta un espacio en su nombre ;-) ''. Todo lo dicho: limpiemos; Estoy borrando mis comentarios. ¡Bienvenido a Stack Exchange! – Arjan

0

Si va a dar los números como una cadena como "1234" no dará ninguna excepción o error. Pero le dará cualquier carácter o carácter especial, entonces la función parse() emitirá una excepción. Así que asegúrese bien de que debe haber algún personaje está pasando por lo que está lanzando una excepción y conseguir estrelló

+0

¡Gracias por su ayuda! :) – BGM

+0

Su problema está resuelto o no? –

+0

¡Sí, todo solucionado! ¡Gracias! – BGM

0

Asegúrese text es sólo números en una cadena, es probable que no lo es. También es posible que desee probar:

Integer number = Integer.valueOf(text); 

en lugar de:

Integer number = Integer.parseInt(text); 

Ver:

parseInt() devuelve tipo entero primitivos (int), mediante el cual valueOf vuelve java.lang .Entero, que es el objeto representativo del número entero . Hay circunstancias en las que es posible que desee un objeto entero , en lugar de tipo primitivo.

Editar: Después de sus comentarios a continuación, me gustaría conectarse text cada vez que en el bucle, es probable que cuando se lanza el error del registro mostrará la variable text está vacía.

+0

Lamentablemente, la aplicación sigue bloqueándose después de probar tu código. La forma en que estoy generando mi arraylist para el archivo en la otra actividad es: – BGM

+0

'code'String filename =" test_file.txt "; \t \t FileOutputStream fos; \t \t try { \t \t \t fos = openFileOutput (filename, Context.MODE_PRIVATE); \t \t \t ObjectOutputStream out = new ObjectOutputStream (fos); \t \t \t out.writeObject (arrayList); \t \t \t out.close(); \t \t} catch (FileNotFoundException e) { \t \t \t // TODO Auto-generado bloque catch \t \t \t e.printStackTrace(); \t \t} catch (IOException e) { \t \t \t // TODO Auto-generado bloque catch \t \t \t e.printStackTrace(); \t \t} 'código' ........' code'arrayList.add (Integer.toString (val [0]) + "\ n"); 'código' – BGM

+0

** He comprobado el 'code'text'code' imprimiéndolo bajo textView y solo hay números en la cadena después de usar la función replaceAll (" [^ 0-9] * "," "). – BGM

2

Todas las respuestas anteriores son ciertas, pero que no le ayudará si, por razones algunos datos que vienen a que no es una Integer.eg- El servidor por error te envió el nombre de usuario en lugar de userId (debería ser un Entero).

Esto puede suceder así que siempre debemos colocar controles para evitarlo. De lo contrario, nuestra aplicación se bloqueará y no será una experiencia agradable para el usuario. Por lo tanto, al convertir String en Integer, utilice siempre un bloque try-catch para evitar bloqueos de la aplicación. Uso el siguiente código para evitar el bloqueo de la aplicación debido al análisis de Integer:

try { 
    Log.d(TAG, Integer.parseInt(string)); 
    } catch (NumberFormatException e) { 
     Log.w(TAG, "Key entered isn't Integer"); 
    } 
Cuestiones relacionadas