1

안드로이드 앱에서 읽기 기능을 개발하여 장치의 CSV 파일을 읽을 수 있습니다. 여기 내 코드입니다 :CSV 파일을 읽을 때 Nullpointer 예외가 발생했습니다.

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++; 
} 

+0

예제에 쉼표가 없습니다. 처리중인 파일에 쉼표가 있는지 확인하십시오. –

+0

String [] [] Data를 초기화해야한다고 생각합니다. 일부 크기와 함께 . 뭔가, String [] [] Data = new String [2] [4]; – user370305

+0

하지만 배열을 초기화하면 크기가 고정됩니다. 행할 수는 있지만 고정 된 수의 열을 가질 수있는 CSV 파일을 읽으려는 것이기 때문입니다. – Conrad

답변

3

이 아니고 인 배열은 String[]입니다. 이 같은

뭔가 :

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

내가 대신 배열의 List<T>을 사용하는 것이 좋습니다 것입니다.

List<String[]> list; 

list=new ArrayList<String>(); 

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

좋아요, 먼저 시도해 보겠습니다. – Conrad

+0

arraylist를 사용하여 주셔서 감사합니다. 이제 작동합니다. – Conrad

관련 문제