前提・実現したいこと
AndroidstudioでJavaを使ってクイズアプリを作っています。
ファイル内のテキストファイルをString[] getFilenameに読み込み、さらに拡張子を消したものをString[] Filename格納するところでエラーが起きています。
自分ではどうしたらよいのかわからないので質問しました。
発生している問題・エラーメッセージ
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.namaeate, PID: 28012 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.namaeate/com.example.namaeate.MainActivity}: java.lang.NullPointerException: Attempt to get length of null array at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) Caused by: java.lang.NullPointerException: Attempt to get length of null array at com.example.namaeate.MainActivity.onCreate(MainActivity.java:85) at android.app.Activity.performCreate(Activity.java:7994) at android.app.Activity.performCreate(Activity.java:7978) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:223) at android.app.ActivityThread.main(ActivityThread.java:7656) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
該当のソースコード
不必要なところはカットしたのでエラーが出ている85行目は
for(i = 0; i < listFile.length; i++) の所です
MainActivity.java
package com.example.namaeate; import androidx.appcompat.app.AppCompatActivity; import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.content.Intent; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import java.io.BufferedReader; import java.io.File; import java.io.FilenameFilter; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public class MainActivity extends AppCompatActivity { private Button ansBtn1; private Button ansBtn2; private Button ansBtn3; private Button ansBtn4; private Button maisu1_Button; public int prob = 2; //問題数 public int quiz; //現在の問題番号 public int i; public int j = 0; public int ans = 0; public int count = 0; //正解数 public int backcount = 0; //やり直し回数 public int maisu; // クイズデータの準備 public String[][] quizData = new String[prob][4]; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getId(); //フォルダ内のテキストファイルの読み込み //フィルタを作成する String[] getFilename = new String[100]; File dir = new File("assets/kanji"); File[] listFile = dir.listFiles(); String[] Filename = new String[100]; for(i = 0; i < listFile.length; i++) { //errorが出たところ if (listFile[i].getName().contains(".txt")) { getFilename[i] = listFile[i].getName(); //拡張子を消してテキストファイルの名前をFilenameに保存 Filename[i] = getFilename[i].substring(0,getFilename[i].lastIndexOf('.')); } else {//何もしない } } List<String> list = new ArrayList<String>();// リストを作成 for(i = 0;i < j;i++) { list.add(String.valueOf(i)); } Collections.shuffle(list); //テキストファイルのテキストを行ごとにtextに保存 InputStream is = null; BufferedReader br = null; String[] text = new String[100]; j = 0; try { try { // assetsフォルダ内のtxtをオープンする is = this.getAssets().open("kanji/"+ Filename +".txt"); br = new BufferedReader(new InputStreamReader(is)); // 1行ずつ読み込み、改行を付加する String str = null; while ((str = br.readLine()) != null) { text[j] = str ; j++; } } finally { if (is != null) is.close(); if (br != null) br.close(); } } catch (Exception e){ // エラー発生時の処理 } //選択肢ランダム化 List<String> list2 = new ArrayList<String>();// リストを作成 for(i = 0;i < j;i++) { list2.add(String.valueOf(i)); } Collections.shuffle(list2); quizData[quiz][0] = getFilename[Integer.parseInt(list.get(quiz))];//正解 quizData[quiz][1] = text[Integer.parseInt(list2.get(0))];//選択肢1 quizData[quiz][2] = text[Integer.parseInt(list2.get(1))];//選択肢2 quizData[quiz][3] = text[Integer.parseInt(list2.get(2))];//選択肢3 //showQuiz List<Integer> num; switch (maisu) { case 1: ansBtn1.setVisibility(View.GONE); ansBtn2.setVisibility(View.GONE); ansBtn3.setVisibility(View.GONE); ansBtn4.setVisibility(View.GONE); break; case 2: ansBtn3.setVisibility(View.GONE); ansBtn4.setVisibility(View.GONE); maisu1_Button.setVisibility(View.GONE); num = Arrays.asList(0, 1); Collections.shuffle(num); ansBtn1.setText(quizData[quiz][num.get(0)]); ansBtn2.setText(quizData[quiz][num.get(1)]); break; case 3: ansBtn4.setVisibility(View.GONE); maisu1_Button.setVisibility(View.GONE); num = Arrays.asList(0, 1, 2); Collections.shuffle(num); ansBtn1.setText(quizData[quiz][num.get(0)]); ansBtn2.setText(quizData[quiz][num.get(1)]); ansBtn3.setText(quizData[quiz][num.get(2)]); break; case 4: maisu1_Button.setVisibility(View.GONE); num = Arrays.asList(0, 1, 2, 3); Collections.shuffle(num); ansBtn1.setText(quizData[quiz][num.get(0)]); ansBtn2.setText(quizData[quiz][num.get(1)]); ansBtn3.setText(quizData[quiz][num.get(2)]); ansBtn4.setText(quizData[quiz][num.get(3)]); break; } } public void getId(){ ansBtn1 = findViewById(R.id.bt1); ansBtn2 = findViewById(R.id.bt2); ansBtn3 = findViewById(R.id.bt3); ansBtn4 = findViewById(R.id.bt4); maisu1_Button = findViewById(R.id.maisu1_button); } public void onButton(View view){ //押されたボタン Button clickedBtn =(Button)view; String clickedAns =clickedBtn.getText().toString(); if(clickedAns.equals(quizData[quiz][0])){ //正解 ans = 0; }else{ //不正解 ans = 1; } Intent intent = new Intent(MainActivity.this,Answer.class); //Answerに送る変数 intent.putExtra("maisu",maisu); intent.putExtra("ans",ans); intent.putExtra("quiz", quiz); intent.putExtra("prob",prob); intent.putExtra("count",count); intent.putExtra("backcount",backcount); startActivity(intent); finish(); } }
補足情報(FW/ツールのバージョンなど)
Androidstudioのバージョン
Android Studio Arctic Fox | 2020.3.1 Patch 4
Build #AI-203.7717.56.2031.7935034, built on November 21, 2021
ランタイム・バージョン: 11.0.10+0-b96-7249189 amd64
VM: OpenJDK 64-Bit Server VM by Oracle Corporation
Windows 10 10.0
GC: G1 Young Generation, G1 Old Generation
Memory: 1280M
Cores: 6
Registry: external.system.auto.import.disabled=true
Non-Bundled Plugins: org.jetbrains.kotlin
まだ回答がついていません
会員登録して回答してみよう