2015-07-03 3 views
0

У меня есть этот код, чтобы написать двойной номер внутри файла txt, находящегося в необработанной папке, а другой - для чтения файла и поместить весь двойной номер внутри массива. Я использую массив, чтобы сделать среднее значение двойного числа в файле. (Двойник - мой балл рейтинга). Запись вызывается кнопкой OnClickListener после чтения.Исключение Null Pointer при написании в ArrayList

(Может кто-то изменить это, я обычно не писать по-английски, так что я уверен, что это будет иметь какие-то ошибки, даже в этой цитате вероятно)

Запись:

private void writeMyArray(double rate){ 
     //PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("arraymedia.txt", true))); 
     //.println(rate); 
     double ratex2 = rate * 2; 
     int erate = (int)ratex2; 
      try 
      { 
       OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput("myarray.txt", Context.MODE_APPEND)); 
       outputStreamWriter.append(Integer.toString(erate)); 
       outputStreamWriter.close(); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

} 

Читайте:

private void readMyArray(ArrayList<Double>array){ 

    String ret = ""; 


      try { 
       InputStream inputStream = this.getResources().openRawResource(R.raw.myarray); 

       if (inputStream != null) { 
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
        String receiveString = ""; 
        StringBuilder stringBuilder = new StringBuilder(); 
        int enc = 0; 
        while ((receiveString = bufferedReader.readLine()) != null) { 
         stringBuilder.append(receiveString); 
         array.set(enc, Double.parseDouble(bufferedReader.readLine())); 
         ++enc; 
        } 
        inputStream.close(); 
      } 
     } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
} 

Средняя

private double media(ArrayList<Double>array) 
{ 
    double total = 0; 
    double media; 
    int a = 0; 
    for (int i=0; i<array.size(); i++) 
    { 
     total = total + array.get(i); 
     a=i; 
    } 
    media = total/a; 
    return media; 
} 

Ошибка в LogCat

07-03 09:55:14.496 17307-17307/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.example.emilio.notification, PID: 17307 
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.util.ArrayList.set(int, java.lang.Object)' on a null object reference 
     at com.example.emilio.notification.MainActivity.readMyArray(MainActivity.java:210) 
     at com.example.emilio.notification.MainActivity.access$200(MainActivity.java:45) 
     at com.example.emilio.notification.MainActivity$2.onClick(MainActivity.java:111) 
     at android.view.View.performClick(View.java:4780) 
     at android.view.View$PerformClick.run(View.java:19866) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5257) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Кнопка Нажмите Код

button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ratingbar.setEnabled(false); 
      rating = ratingbar.getRating(); 

      writeMyArray(rating); 
      readMyArray(arraydays); 
      button.setText(getText(R.string.obrigado) + "!" + media(arraydays)); 
      //button.setText(getText(R.string.obrigado)+"!"); 

      button.setEnabled(false); 
     } 
    }); 

UPTADE

при изменении array.set(), он дал мне эту ошибку:

07-03 10:25:53.576 25334-25334/com.example.emilio.notification E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.example.emilio.notification, PID: 25334 
java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
     at java.util.ArrayList.set(ArrayList.java:481) 
     at com.example.emilio.notification.MainActivity.readMyArray(MainActivity.java:210) 
     at com.example.emilio.notification.MainActivity.access$200(MainActivity.java:45) 
     at com.example.emilio.notification.MainActivity$2.onClick(MainActivity.java:111) 
     at android.view.View.performClick(View.java:4780) 
     at android.view.View$PerformClick.run(View.java:19866) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5257) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
+2

Что связано с текущим кодом? –

+2

У вас есть инициализация массива при чтенииMyArray, это вызывает ошибку –

+1

Кажется, что 'arrayDays' не инициализируется. – Dobz

ответ

2

Проблема в ваше время цикла

while(receiveString = bufferedReader.readLine()) != null) 

Это нормально, потому что она проверяет null.

Но в вашей петле вы снова получите bufferedReader.readLine().

Значит, это означает, что цикл находится на последнем string, который не является null.

Код должен выбрать следующий string который теперь равен null.

while ((receiveString = bufferedReader.readLine()) != null) { 
    stringBuilder.append(receiveString); 

    // The next line is the problem 
    // bufferedReader.readline() is either null 
    // or array is null 

    // bufferedReader.readLine() is going to be set to null on the last run. 
    array.set(enc, Double.parseDouble(bufferedReader.readLine())); 

    ++enc; 
} 

Я думаю, вы можете искать для этого вместо

array.set(enc, Double.parseDouble(receiveString)); 

или, возможно, это

string doubleToParse = bufferedReader.readLine(); 
if(doubleToParse != null) { 
    array.set(enc, doubleToParse); 
} 

Примечание:
Со второй ответ, вы будете принимать две линии от bufferedReader каждый раз, когда вы проходите через цикл.

Следующая проблема, с которой вы можете столкнуться, составляет ArrayList.

Убедитесь, что вы уже назвали

ArrayList<Double> arrayDays = new ArrayList<Double>(); 

И если вы еще не заселена массив уже. Вы должны называть:

array.add(Double.parseDouble(doubleToParse)); 

На заключительной ноте, вы должны быть уверены, что каждая строка, разбираем на самом деле содержит Double.

Или вы столкнетесь с java.lang.NumberFormatException.

try { 
    Double d = Double.parseDouble(doubleToParse); 
    array.add(d); 
} catch (NumberFormatException ex) { 
    System.out.println(ex.getMessage()); 
} 
+0

См. Обновление, пожалуйста, –

+1

Обновлен мой ответ. Вы должны использовать 'array.add()', потому что 'array.set()' изменяет 'Double', который уже существует. Но, похоже, он еще не заселен. – Dobz

+0

Спасибо, человек! Теперь у меня другая проблема, в моем коде для записи, я забыл изменить файл myarray.txt в файл необработанных папок, как я могу нарисовать R.raw.myarray? –

0

код представляется целесообразным заменить

InputStream inputStream = this.getResources().openRawResource(R.raw.myarray); 

в

InputStream inputStream = MainActivity.this.getResources().openRawResource(R.raw.myarray); 

Должно работать для вас.

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