質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1156閲覧

ディレクトリ内のテキストファイルを読み込みたい

rott

総合スコア6

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2021/12/26 05:38

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/12/26 07:11

> NullPointerException ですから、 listFile が null なのでしょう。 > どうしたらよいのかわからない なぜ listFile が null になるのかを調べて対処する必要があるのでは無いでしょうか。 なお、 i や j といったループに使う変数までフィールドにするのは止めたほうが良いです。 「何度も使うから最初から用意しておく」という理由でしたら、それは「分かり難いバグの原因」の危険性より優先されるものではありません。 変数のスコープを極力狭くし、コードの部分々々の独立性を高めることでの再利用性や安全性、読み易さ・修正し易さ等を確保するほうが重要です。
guest

回答1

0

自己解決

ファイル読み込みの所をassetMgr.list("path")にしたら直りました
解答してくれた方ありがとうございました

投稿2021/12/26 14:27

rott

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問