inputStream无法获取android的csvfile

时间:2018-09-06 14:29:22

标签: java android

我花了3天的时间在Android上加载csv文件。我已经创建了原始文件夹并向其中添加了brojler.csv文件。但是,每次尝试加载它时,都会收到NullPointerException错误。我试图自己阅读并解决该问题,但是基于这个主题(What is a NullPointerException, and how do I fix it?)我找不到原因。我是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中的代码,而在另一个应用程序中,它失败,因为它在另一个(非主要)活动中被调用。

我们将不胜感激

1 个答案:

答案 0 :(得分:0)

NullPointerException告诉您某些内容为空。即它没有引用有效实例。

从外观上看,您需要初始化列表。我看不到要初始化它们的任何地方。我还发现奇怪的是,假设您正在使用Android Studio lint,它没有警告您可能为null的变量。

好,这是:

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。