【问题标题】:Nullpointer exception when trying to read a csv file尝试读取 csv 文件时出现 Nullpointer 异常
【发布时间】:2012-08-06 07:28:18
【问题描述】:

我想在我的 android 应用程序中开发一个读取功能,以便它可以读取设备中的 csv 文件。这是我的代码:

Button btninsert;
TextView CSV1;
TextView CSV2;
TextView CSV3;
TextView CSV4;
String[][] Data;
int numrecord=0;

@Override
public void onCreate(Bundle savedInstanceState) {

    //create the activity
    super.onCreate(savedInstanceState);

    //set up the layout
    setContentView(R.layout.activity_chico);
    btninsert = (Button) findViewById(R.id.Insert);
    CSV1 = (TextView) findViewById(R.id.CSV1);
    CSV2 = (TextView) findViewById(R.id.CSV2);
    CSV3 = (TextView) findViewById(R.id.CSV3);
    CSV4 = (TextView) findViewById(R.id.CSV4);
    if(new File(Environment.getExternalStorageDirectory()+"/Chico/record.csv").exists()){
        btninsert.setVisibility(View.VISIBLE);
    }else{
        btninsert.setVisibility(View.GONE);         
    }
    CSV1.setVisibility(View.GONE);
    CSV2.setVisibility(View.GONE);
    CSV3.setVisibility(View.GONE);
    CSV4.setVisibility(View.GONE);

    btninsert.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            btninsert.setVisibility(View.GONE);
            try {
                BufferedReader reader = new BufferedReader(new FileReader(Environment.getExternalStorageDirectory()+"/Chico/record.csv"));
                try {
                    String line;
                    while ((line = reader.readLine()) != null){
                        String[] RowData = line.split(",");
                        Data[numrecord][0]=RowData[0];
                        Data[numrecord][1]=RowData[1];
                        Data[numrecord][2]=RowData[2];
                        Data[numrecord][3]=RowData[3];
                        numrecord++;
                    }
                } catch (IOException ex) {

                }
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            for(int i=0; i<numrecord; i++){
                if(i==0){
                    CSV1.setVisibility(View.VISIBLE);
                    CSV2.setVisibility(View.VISIBLE);
                    CSV3.setVisibility(View.VISIBLE);
                    CSV4.setVisibility(View.VISIBLE);

                    CSV1.setText(Data[i][0]);
                    CSV2.setText(Data[i][1]);
                    CSV3.setText(Data[i][2]);
                    CSV4.setText(Data[i][3]);
                }else{
                    CSV1.append(" "+Data[i][0]);
                    CSV2.setText(" "+Data[i][1]);
                    CSV3.setText(" "+Data[i][2]);
                    CSV4.setText(" "+Data[i][3]);
                }
            }
        }
    });
}

但是,每当我点击按钮时,系统意外结束,并且错误日志中出现错误消息,其中提到了以下几行出现空指针异常。

Data[numrecord][0]=RowData[0];
Data[numrecord][1]=RowData[1];
Data[numrecord][2]=RowData[2];
Data[numrecord][3]=RowData[3];

谁能告诉我异常的原因是什么?

我的示例 csv 文件包含两行,每行有四列。就像我在下面做的例子一样:

1 1 in 8/6/2012
1 1 out 8/6/2012

如果我在 while 循环中使用以下代码,它可以正常工作:

while ((line = reader.readLine()) != null){
    String[] RowData = line.split(",");
    if(numrecord==0) {
        CSV1.setText(RowData[0]);
        CSV2.setText(RowData[1]);
        CSV3.setText(RowData[2]);
        CSV4.setText(RowData[3]);
    } else {
        CSV1.append(" "+RowData[0]);
        CSV2.append(" "+RowData[1]);
        CSV3.append(" "+RowData[2]);
        CSV4.append(" "+RowData[3]);
    }
    numrecord++;
}

这就是为什么我认为问题出在数据数组上

【问题讨论】:

  • 你给出的例子没有逗号,你确定你处理的文件有逗号吗?
  • 我认为你必须初始化 String[][] 数据;有一些大小。类似于 String[][] Data = new String[2][4];
  • 但是如果我初始化数组,那么大小是固定的,因为我想做的是读取一个csv文件,它可以有不同的行数但固定的列数。
  • 在运行时根据 csv 文件数据行和列的大小初始化 Data 的大小。

标签: android exception exception-handling nullpointerexception


【解决方案1】:

没有创建String[] 的数组。

类似这样的:

String[][] Data;
Data=new String[100];
Data[0]=new String[10];
Data[1]=new String[10];

我建议使用List&lt;T&gt; 而不是数组。

List<String[]> list;

list=new ArrayList<String>();

 while ((line = reader.readLine()) != null){
     String[] RowData = line.split(",");
     list.add(RowData);
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多