#android #android-studio #nullpointerexception #retrofit2
Вопрос:
У меня есть приложение в производстве. В моем приложении на экране «Забыли пароль», когда пользователь вводит свой номер мобильного телефона, вызывается api, и пользователь получает OTP на введенный номер ,api выполняется так, как задумано, но я получаю исключение NullPointerException в моем производственном приложении, и пользователь не перенаправляется на следующий экран, как следует, все работает нормально в отладочной сборке для целей тестирования, но в производстве это вызывает исключение NullPointerException. Я вижу, что вызов api завершен успешно из-за инструкции print, которая у меня есть во время успешного вызова api, но после этого сообщения logcat показывает исключение NullPointerException. Когда возникает исключение NullPointerException и в logcat я не могу определить, в чем именно заключается проблема, поскольку оно не указывает, какая часть кода отвечает за NPE.
private void forgotPasswordApi() {
if (Util.isConnectingToInternet(context)) {
CommonMethods.showLoading(this);
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
builder.addFormDataPart(Constants.MOBILE, mobileEt.getText().toString());
MultipartBody requestBody = builder.build();
RetrofitClient.getAPIService().userForgotPassword(requestBody).enqueue(new Callback<RetroResponse>() {
@Override
public void onResponse(@NotNull Call<RetroResponse> call, Response<RetroResponse> response) {
CommonMethods.dismissLoading();
Log.e("USER FORGOT PASSWORD","INSIDE onResponse BLOCK ");
try {
if (response.code() == 200) {
String user_id = response.body().getData().getUser_id();
startActivity(new Intent(UserForgotPasswordActivity.this, ForgotOtpVerifyActivity.class)
.putExtra(Constants.USER_ID, user_id));
} else if (response.code() == 400) {
Log.e("USER FORGOT PASSWORD","INSIDE 400 BLOCK ");
Util.ShowToastMessage(context, R.string.user_not_registered);
} else {
if (response.body().getStatus() == 401) {
Util.ShowToastMessage(context, "Something went wrong");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<RetroResponse> call, Throwable t) {
Log.e("USER FORGOT PASSWORD","INSIDE onFailure BLOCK ");
CommonMethods.dismissLoading();
}
});
} else {
Util.ShowToastMessage(context, R.string.internet_connection);
}
}
Это сообщение об исключении, которое я получаю в logcat чуть ниже сообщения об успешной печати :
2021-09-21 12:42:37.006 18184-18184/? W/System.err: java.lang.NullPointerException
2021-09-21 12:42:37.006 18184-18184/? W/System.err: at c.e.a.e.a.b.m1.a(SourceFile:9)
2021-09-21 12:42:37.006 1585-1585/? D/StatusBar: disable<e i a s b h r c s > disable2<q i n >
2021-09-21 12:42:37.006 18184-18184/? W/System.err: at t.b.run(SourceFile:1)
2021-09-21 12:42:37.006 18184-18184/? W/System.err: at android.os.Handler.handleCallback(Handler.java:938)
2021-09-21 12:42:37.006 18184-18184/? W/System.err: at android.os.Handler.dispatchMessage(Handler.java:99)
2021-09-21 12:42:37.006 18184-18184/? W/System.err: at android.os.Looper.loop(Looper.java:236)
2021-09-21 12:42:37.006 18184-18184/? W/System.err: at android.app.ActivityThread.main(ActivityThread.java:8043)
2021-09-21 12:42:37.006 18184-18184/? W/System.err: at java.lang.reflect.Method.invoke(Native Method)
2021-09-21 12:42:37.006 18184-18184/? W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:620)
2021-09-21 12:42:37.006 18184-18184/? W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1011)
Когда я тестировал свое приложение с помощью отладочной сборки , я не сталкивался с каким-либо таким исключением, оно поставляется с приложением в производстве(в магазине Google Play), Пожалуйста, предложите любое решение или назовите возможную причину исключения, спасибо.
Комментарии:
1. По какой линии у вас есть NPE? Можете ли вы сказать, какая переменная равна нулю ?
2. @ChrisNeve я не могу определить, где именно в коде возникает исключение, потому что мне удается распечатать только некоторые журналы из приложения в prosuction.
Ответ №1:
Причина,по которой вы видите эти странные символы a,b, c, заключается в том, что вы запутываете свой код. Вам необходимо устранить путаницу или обозначить следы стека сбоев на игровой консоли. Для лучшего управления сбоями вы можете использовать Firebase crashlytics. Когда вы устраните путаницу в трассировке стека, вы увидите, какая часть точно равна нулю.
Комментарии:
1. Приложение не совсем разбивается, поэтому я ничего не вижу в отчете о сбое в play console, и мне нужно удалить firebase crashlytics, потому что он не позволял мне создавать подписанный apk. когда я пытался сгенерировать подписанный apk, я получал некоторые ошибки во время сборки, поэтому я искал проблему, и кто-то в SO предложил удалить crashlytics из файла build.gradle, что я и сделал.