InputStream не может получить csvfile android

Бился 3 дня с загрузкой csv файла на андроид. Я создал необработанную папку и добавил в нее файл brojler.csv. Однако каждый раз, когда я пытаюсь его загрузить, я получаю ошибку NullPointerException. Сам пробовал читать и решать, но исходя из этой темы (Что такое исключение NullPointerException и как его исправить?) не могу найти причину. Я новичок в android, но думаю, что все переменные определены хорошо. Как ни странно, в другом приложении тот же код работает и правильно загружает файл.

Brojler.csv состоит из 9 столбцов и 12 строк.

Кроме того, я изменил способ объявления списков, как показано ниже, но безуспешно.

List<String> ingredients = new ArrayList<>();
List<String> em = new ArrayList<>();
List<String> bo = new ArrayList<>();
And so on,

Мой код:

package com.example.nick.calcy;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Mix extends AppCompatActivity {
    InputStream inputStream;
    List<String> ingredients,em,bi,ws,ca,fs,na,L,M = new ArrayList<>();
    String[] ids;
    EditText et1,et2,et3,et4,et5,et6,et7;
    Float sum;
    Button buttonSum;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mix);

        et1 = findViewById(R.id.editText11);

        et2 = findViewById(R.id.editText12);

        et3 = findViewById(R.id.editText13);

        et4 = findViewById(R.id.editText14);

        et5 = findViewById(R.id.editText15);

        et6 = findViewById(R.id.editText16);

        et7 = findViewById(R.id.editText17);

        buttonSum = findViewById(R.id.button11);

        inputStream = getResources().openRawResource(R.raw.brojler);

        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        try {
            String csvLine;
            while ((csvLine = reader.readLine()) != null) {

                ids=csvLine.split(",");
                try{
                    ingredients.add(ids[0]);
                    em.add(ids[1]);
                    bi.add(ids[2]);
                    ws.add(ids[3]);
                    ca.add(ids[4]);
                    fs.add(ids[5]);
                    na.add(ids[6]);
                    L.add(ids[7]);
                    M.add(ids[8]);

                }catch (Exception e){
                    Log.e("Unknown error",e.toString());
                }
            }

        }
        catch (IOException ex) {
            throw new RuntimeException("Error in reading CSV file: "+ex);
        }


        buttonSum.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                if (et1.getText().toString().trim().length() == 0 ||
                        et2.getText().toString().trim().length() == 0 ||
                        et3.getText().toString().trim().length() == 0 ||
                        et4.getText().toString().trim().length() == 0 ||
                        et5.getText().toString().trim().length() == 0 ||
                        et6.getText().toString().trim().length() == 0 ||
                        et7.getText().toString().trim().length() == 0) {
                    CharSequence text = "Blank fields detected";
                    Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG).show();
                }
                else{
                    Intent i = new Intent(getApplicationContext(),Summary.class);
                    Float x1 = Float.parseFloat(et1.getText().toString());
                    Float x2 = Float.parseFloat(et2.getText().toString());
                    Float x3 = Float.parseFloat(et3.getText().toString());
                    Float x4 = Float.parseFloat(et4.getText().toString());
                    Float x5 = Float.parseFloat(et5.getText().toString());
                    Float x6 = Float.parseFloat(et6.getText().toString());
                    Float x7 = Float.parseFloat(et7.getText().toString());

                    sum = x1+x2+x3+x4+x5+x6+x7;

                    i.putExtra("x1", x1);
                    i.putExtra("x2", x2);
                    i.putExtra("x3", x3);
                    i.putExtra("x4", x4);
                    i.putExtra("x5", x5);
                    i.putExtra("x6", x6);
                    i.putExtra("x7", x7);

                    if (sum == 100){
                        startActivity(i);
                    } else{
                        CharSequence text = "Sum must equal 100%";
                        Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG).show();
                    }
                }}
        });
    }
}

Мои ошибки:

E/Unknown error: java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference
I/chatty: uid=10083(u0_a83) com.example.nick.calcy identical 1 line
E/Unknown error: java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference
E/Unknown error: java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference
I/chatty: uid=10083(u0_a83) com.example.nick.calcy expire 7 lines
E/Unknown error: java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference

Предполагаю, что проблема может заключаться в уровне доступа к файлу. В рабочем приложении я использую код в main_activity, а в другом приложении он не работает, потому что он вызывается в другом (не основном) действии.

Помощь будет очень признательна

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

NullPointerException сообщает вам, что что-то не имеет значения. т.е. он не ссылается на действительный экземпляр.

Судя по всему, вам нужно инициализировать свои списки. Я не вижу нигде, где вы их инициализируете. Мне также кажется странным, что Android Studio lint не предупредил вас о возможной нулевой переменной, предполагая, что это то, что вы используете.

Хорошо, вот оно:

List<String> ingredients = new ArrayList<>(),
em = new ArrayList<>(),
bi = new ArrayList<>(),
ws = new ArrayList<>(),
ca = new ArrayList<>(),
fs = new ArrayList<>(),
na = new ArrayList<>(),
L = new ArrayList<>(),
M = new ArrayList<>();

Кроме того, проверьте, содержат ли строки ожидаемое количество столбцов; то есть проверьте, есть ли в массиве ids все необходимые элементы, если вы не уверены, что все строки содержат.

Кроме того, я почти уверен, что есть лучший способ делать то, что вы делаете. Вы также можете изучить использование Gson / JSON, если у вас есть контроль над данными.

Другие вопросы по теме