###実現したいこと
Androidアプリでローカルのとあるフォルダの全ファイルのデータを読み出し、Fragmentで指定したファイルのデータを取得してグラフを描く。(MPAndroidChart使用)
###該当のソースコード
java
1public class ReadData { 2 private String path = パス; 3 private File file; 4 private File[] fileList; 5 private File dataFile; 6 7 private int numFiles; 8 9 private float[][] array1; 10 private float[][] array2; 11 private float[][] array3; 12 13 public void readDataFile(Context context) { 14 String text; 15 fileAccess(); 16 17 for(int i = 0; i < numFiles; i++){ 18 int j = 0; 19 dataFile = fileList[i]; 20 //ファイル名取得 21 String fileName = dataFile.getName(); 22 23 try{ 24 FileInputStream fileInputStream = context.openFileInput(fileName); 25 BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream,"UTF-8")); 26 27 String lineBuffer; 28 29 while ((lineBuffer = reader.readLine()) != null){ 30 text = lineBuffer; 31 String[] data = text.split(",", -1); 32 33 array1[i][j] = Float.parseFloat(data[0]); 34 array2[i][j] = Float.parseFloat(data[1]); 35 array3[i][j] = Float.parseFloat(data[2]); 36 37 j++; 38 } 39 fileInputStream.close(); 40 reader.close(); 41 } catch (IOException e) { 42 e.printStackTrace(); 43 } 44 } 45 } 46 47 public void fileAccess(){ 48 file = new File(path); 49 fileList = file.listFiles(); 50 numFiles = fileList.length; 51 } 52 53 public int getNumFiles() { 54 return numFiles; 55 } 56 57 public File[] getFileList() { 58 return fileList; 59 } 60 61 public float[][] getArray1() { 62 return array1; 63 } 64 65 public float[][] getArray2() { 66 return array2; 67 } 68 69 public float[][] getArray3() { 70 return array3; 71 } 72} 73
java
1public class GraphFragment extends Fragment { 2 private DataViewModel dataViewModel; 3 private ReadData readData; 4 5//省略 6 7 @Override 8 public void onViewCreated(View root, Bundle bundle){ 9 dataViewModel = ViewModelProviders.of(getActivity()).get(dataViewModel.class); 10 11 mChart = root.findViewById(R.id.line_chart); 12 13 setUpLineChart(); 14 15 //別画面で選択したファイルがfile.listFiles()の何個目かわたす。 16 final Observer<Integer> observer = new Observer<Integer>() { 17 @Override 18 public void onChanged(Integer integer) { 19 setData(integer); 20 } 21 }; 22 dataViewModel.getItemNumber().observe(getViewLifecycleOwner(), observer); 23 } 24 25 private void setData(int i){ 26 readData = new ReadData(); 27 readData.readDataFile(getContext()); 28 float[][] data = readData.getArray2(); 29 30 ArrayList<Entry> values = new ArrayList<>(); 31 32 for(int j = 0; j < data[i].length; j++){ 33 values.add(new Entry(j, data[i][j], null, null)); 34 } 35 36//省略
Fragmentの方、全て載せると長いのでデータセットに関する部分のみ抜粋しました。
###発生している問題
データの格納の仕方が悪いのか、Fragmentでの配列の要素の取得がわるいのかわかりませんが、data[i][j]がnullになってしまいます。nullになってしまう原因、対処がわからないので教えていただきたいです。
Android StudioのLogCatのエラーを確認したところ、setDataのfor文の中のdata配列で
java.lang.NullPointerException: Attempt to read from null array
と出ていました。

回答2件
あなたの回答
tips
プレビュー