前提・実現したいこと
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
1package com.example.namaeate; 2 3import androidx.appcompat.app.AppCompatActivity; 4 5import android.content.res.AssetManager; 6import android.graphics.Bitmap; 7import android.graphics.BitmapFactory; 8import android.os.Bundle; 9 10import android.content.Intent; 11import android.view.View; 12import android.widget.Button; 13import android.widget.ImageView; 14import android.widget.TextView; 15 16import java.io.BufferedReader; 17import java.io.File; 18import java.io.FilenameFilter; 19import java.io.InputStream; 20import java.io.InputStreamReader; 21import java.util.ArrayList; 22import java.util.Arrays; 23import java.util.Collections; 24import java.util.List; 25 26public class MainActivity extends AppCompatActivity { 27 28 private Button ansBtn1; 29 private Button ansBtn2; 30 private Button ansBtn3; 31 private Button ansBtn4; 32 private Button maisu1_Button; 33 34 public int prob = 2; //問題数 35 public int quiz; //現在の問題番号 36 public int i; 37 public int j = 0; 38 public int ans = 0; 39 public int count = 0; //正解数 40 public int backcount = 0; //やり直し回数 41 public int maisu; 42 43 // クイズデータの準備 44 public String[][] quizData = new String[prob][4]; 45 46 47 @Override 48 protected void onCreate(Bundle savedInstanceState) { 49 super.onCreate(savedInstanceState); 50 setContentView(R.layout.activity_main); 51 52 getId(); 53 54 //フォルダ内のテキストファイルの読み込み 55 //フィルタを作成する 56 String[] getFilename = new String[100]; 57 File dir = new File("assets/kanji"); 58 File[] listFile = dir.listFiles(); 59 String[] Filename = new String[100]; 60 61 for(i = 0; i < listFile.length; i++) { //errorが出たところ 62 if (listFile[i].getName().contains(".txt")) { 63 getFilename[i] = listFile[i].getName(); 64 //拡張子を消してテキストファイルの名前をFilenameに保存 65 Filename[i] = getFilename[i].substring(0,getFilename[i].lastIndexOf('.')); 66 } else {//何もしない 67 } 68 } 69 70 List<String> list = new ArrayList<String>();// リストを作成 71 for(i = 0;i < j;i++) { 72 list.add(String.valueOf(i)); 73 } 74 Collections.shuffle(list); 75 76 77 //テキストファイルのテキストを行ごとにtextに保存 78 InputStream is = null; 79 BufferedReader br = null; 80 String[] text = new String[100]; 81 j = 0; 82 83 try { 84 try { 85 // assetsフォルダ内のtxtをオープンする 86 is = this.getAssets().open("kanji/"+ Filename +".txt"); 87 br = new BufferedReader(new InputStreamReader(is)); 88 89 // 1行ずつ読み込み、改行を付加する 90 String str = null; 91 while ((str = br.readLine()) != null) { 92 text[j] = str ; 93 j++; 94 } 95 } finally { 96 if (is != null) is.close(); 97 if (br != null) br.close(); 98 } 99 } catch (Exception e){ 100 // エラー発生時の処理 101 } 102 103 //選択肢ランダム化 104 List<String> list2 = new ArrayList<String>();// リストを作成 105 for(i = 0;i < j;i++) { 106 list2.add(String.valueOf(i)); 107 } 108 Collections.shuffle(list2); 109 110 quizData[quiz][0] = getFilename[Integer.parseInt(list.get(quiz))];//正解 111 quizData[quiz][1] = text[Integer.parseInt(list2.get(0))];//選択肢1 112 quizData[quiz][2] = text[Integer.parseInt(list2.get(1))];//選択肢2 113 quizData[quiz][3] = text[Integer.parseInt(list2.get(2))];//選択肢3 114 115 //showQuiz 116 List<Integer> num; 117 switch (maisu) { 118 case 1: 119 ansBtn1.setVisibility(View.GONE); 120 ansBtn2.setVisibility(View.GONE); 121 ansBtn3.setVisibility(View.GONE); 122 ansBtn4.setVisibility(View.GONE); 123 break; 124 case 2: 125 ansBtn3.setVisibility(View.GONE); 126 ansBtn4.setVisibility(View.GONE); 127 maisu1_Button.setVisibility(View.GONE); 128 129 num = Arrays.asList(0, 1); 130 Collections.shuffle(num); 131 132 ansBtn1.setText(quizData[quiz][num.get(0)]); 133 ansBtn2.setText(quizData[quiz][num.get(1)]); 134 break; 135 case 3: 136 ansBtn4.setVisibility(View.GONE); 137 maisu1_Button.setVisibility(View.GONE); 138 139 num = Arrays.asList(0, 1, 2); 140 Collections.shuffle(num); 141 142 ansBtn1.setText(quizData[quiz][num.get(0)]); 143 ansBtn2.setText(quizData[quiz][num.get(1)]); 144 ansBtn3.setText(quizData[quiz][num.get(2)]); 145 break; 146 case 4: 147 maisu1_Button.setVisibility(View.GONE); 148 149 num = Arrays.asList(0, 1, 2, 3); 150 Collections.shuffle(num); 151 152 ansBtn1.setText(quizData[quiz][num.get(0)]); 153 ansBtn2.setText(quizData[quiz][num.get(1)]); 154 ansBtn3.setText(quizData[quiz][num.get(2)]); 155 ansBtn4.setText(quizData[quiz][num.get(3)]); 156 break; 157 } 158 } 159 160 161 public void getId(){ 162 ansBtn1 = findViewById(R.id.bt1); 163 ansBtn2 = findViewById(R.id.bt2); 164 ansBtn3 = findViewById(R.id.bt3); 165 ansBtn4 = findViewById(R.id.bt4); 166 maisu1_Button = findViewById(R.id.maisu1_button); 167 } 168 169 170 public void onButton(View view){ 171 //押されたボタン 172 Button clickedBtn =(Button)view; 173 String clickedAns =clickedBtn.getText().toString(); 174 175 if(clickedAns.equals(quizData[quiz][0])){ 176 //正解 177 ans = 0; 178 179 }else{ 180 //不正解 181 ans = 1; 182 } 183 184 Intent intent = new Intent(MainActivity.this,Answer.class); 185 186 //Answerに送る変数 187 intent.putExtra("maisu",maisu); 188 intent.putExtra("ans",ans); 189 intent.putExtra("quiz", quiz); 190 intent.putExtra("prob",prob); 191 intent.putExtra("count",count); 192 intent.putExtra("backcount",backcount); 193 194 startActivity(intent); 195 finish(); 196 } 197} 198
補足情報(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
回答1件
あなたの回答
tips
プレビュー