Неожиданный вылет (Android, java)
Запускал аналогичный код, для проверки работы в отельном мини проекте - подобных вылетов и ошибок не было. Ошибка основная кидается на строчку: FileInputStream in = openFileInput(read);
Код переписывал уже множество раз, адреса файлов выносил в отельные переменные, сравнения перемещал в отдельные методы. Я сбился с толку в чем может быть проблема.
String read;
public void LoadText() throws IOException {
String line;
if (getControl().equalsIgnoreCase("котлисаслон")) {
read = "text_true_dio_1.txt";
} else if (getControl().equalsIgnoreCase("распределитель")) {
read = "text_true_dio_2.txt";
} else if (getControl().equalsIgnoreCase("стенографистка")) {
read = "text_true_dio_3.txt";
} else if (getControl().equalsIgnoreCase("простокваша")) {
read = "text_true_dio_4.txt";
}
FileInputStream in = openFileInput(read);
InputStreamReader inputStreamReader = new InputStreamReader(in);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
StringBuilder sb = new StringBuilder();
while ((line = bufferedReader.readLine()) != null) {
sb.append(line);
List_String_true.add(line);
if (getControl().equalsIgnoreCase("котлисаслон")) {
thru_list_1.add(line);
} else if (getControl().equalsIgnoreCase("распределитель")) {
thru_list_2.add(line);
} else if (getControl().equalsIgnoreCase("стенографистка")) {
thru_list_3.add(line);
} else if (getControl().equalsIgnoreCase("простокваша")) {
thru_list_4.add(line);
}
}
inputStreamReader.close();
}
2021-02-06 15:21:43.245 6706-6706/freijer.app.dropwords E/AndroidRuntime: FATAL EXCEPTION: main
Process: freijer.app.dropwords, PID: 6706
java.lang.IllegalStateException: Could not execute method for android:onClick
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:402)
at android.view.View.performClick(View.java:7125)
at android.view.View.performClickInternal(View.java:7102)
at android.view.View.access$3500(View.java:801)
at android.view.View$PerformClick.run(View.java:27336)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397)
at android.view.View.performClick(View.java:7125)
at android.view.View.performClickInternal(View.java:7102)
at android.view.View.access$3500(View.java:801)
at android.view.View$PerformClick.run(View.java:27336)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.indexOf(int)' on a null object reference
at android.app.ContextImpl.makeFilename(ContextImpl.java:2650)
at android.app.ContextImpl.openFileInput(ContextImpl.java:599)
at android.content.ContextWrapper.openFileInput(ContextWrapper.java:206)
at freijer.app.dropwords.GameStart.LoadText(GameStart.java:2258)
at freijer.app.dropwords.GameStart.LetsGo(GameStart.java:888)
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397)
at android.view.View.performClick(View.java:7125)
at android.view.View.performClickInternal(View.java:7102)
at android.view.View.access$3500(View.java:801)
at android.view.View$PerformClick.run(View.java:27336)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Ответы (2 шт):
Из строки:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.indexOf(int)' on a null object reference
Из документации:
Parameter name - String: The name of the file to open; can not contain path separators.
openFileInput() производит поиск разделителей в переданной строке, но здесь строка является null, что и приводит к ошибке.
На самом деле, Вашей переменной read может не быть присвоено значение из-за отсутствия else в блоке сравнения (там только else if), это стоит исправить. Например, так:
String read = "";
//Возможно, выбросит FileNotFoundException
Добавь в описание процедуры NullPointerException, как исключение. Можешь код, где это происходит, обернуть в try ... catch