残念ながら、MyAppは停止しました。どうすればこれを解決できますか?
アプリケーションを開発していますが、実行するたびに次のメッセージが表示されます。
残念ながら、MyAppは停止しました。
これを解決するにはどうすればよいですか?
この質問について-明らかにスタックトレースとは何ですか、そしてそれを使用してアプリケーションエラーをデバッグするにはどうすればよいですか?、アプリケーションがクラッシュしたことを示す質問がたくさんありますが、それ以上の詳細はありません。この質問は、初心者のAndroidプログラマーに、自分で問題を解決する方法、または適切な質問をする方法を教えることを目的としています。
回答
この回答は、スタックトレースを取得するプロセスについて説明しています。すでにスタックトレースがありますか?「スタックトレースとは何ですか。アプリケーションエラーをデバッグするためにどのように使用できますか?」のスタックトレースを読んでください。
問題
キャッチRuntimeException
されなかったものがスローされたため、アプリケーションは終了しました。
これらの中で最も一般的なのはNullPointerException
です。
それを解決する方法は?
Androidアプリケーション(またはJavaアプリケーション)がクラッシュするたびStack trace
に、コンソール(この場合はlogcat)にaが書き込まれます。このスタックトレースには、問題を解決するための重要な情報が含まれています。
Android Studio
ウィンドウの下部のバーで、Logcat
ボタンをクリックします。または、alt+を押すこともできます6。Devices
パネルでエミュレータまたはデバイスが選択されていることを確認してください。次に、赤で示されているスタックトレースを見つけてみてください。logcatにログインしているものがたくさんある可能性があるため、少しスクロールする必要があるかもしれません。スタックトレースを見つける簡単な方法は、logcatをクリアして(右側のごみ箱を使用)、アプリを再度クラッシュさせることです。
スタックトレースを見つけましたが、今は何ですか?
わーい!あなたはあなたの問題を解決する途中です。
スタックトレースを分析することで、アプリケーションがクラッシュした原因を正確に特定するだけで済みます。
「スタックトレースとは何ですか。アプリケーションエラーをデバッグするためにどのように使用できますか?」のスタックトレースを読んでください。
私はまだ私の問題を解決することはできません!
自分Exception
とそれが発生した行を見つけても、それを修正する方法がわからない場合は、StackOverflowで遠慮なく質問してください。
できるだけ簡潔にするようにしてください。スタックトレースと関連するコードを投稿します(たとえば、をスローした行までの数行Exception
)。
GoogleのADBツールを使用Logcat file
して、問題を分析することができます。
adb logcat > logcat.txt
logcat.txt
ファイルを開き、アプリケーション名を検索します。失敗した理由、行番号、クラス名などに関する情報が必要です。
まず、アプリがクラッシュしたポイントを確認します(Unfortunately, MyApp has stopped.
)。これには、を使用できますLog.e("TAG", "Message");
。この行を使用すると、logcatでアプリのログを確認できます。
その後、アプリが停止したポイントを見つけるのは、あなたの側で非常に簡単に解決できます。
logcatのエラーを確認してください。
Eclipseからlogcatオプションを取得します。
ウィンドウ->ビューを表示->その他-> Android-> Logcat
ログ猫にエラーが含まれています。
それ以外の場合は、デバッグモードでアプリケーションを実行してエラーを確認することもできます。その後、最初に次のようにしてブレークポイントを設定します。
プロジェクトを右クリック->デバッグとして-> Androidアプリケーション
注:この回答はAndroid Studio2.2.2を使用しています
注2: デバイスが正常に接続されていると考えています。
アプリケーションがクラッシュしたときに最初に行うことは、LogCatを調べることです。AndroidStudioの下部には、メニューのリストを含むツールバーがあります。
「Androidモニター」(上の画像で下線を引いたもの。^)をクリックします。
これで、次のようなものが得られます。
「Verbose
」を「Error
」に変更します。これで、ログに記録されたエラーのみが表示されます。これらすべてのエラーについて心配する必要はありません(エラーが発生した場合)。
OK。次に、アプリをクラッシュさせるために行ったことを実行します。アプリがクラッシュしたら、logcatに移動します。at:x.x.x
:などCaused by: TrumpIsPresidentException
がたくさんある新しいクラッシュログを見つける必要があります。Caused by:
logcatのそのステートメントに移動します。
次のことCaused By:
、起こった例外があるはずです。私の場合、それはaでRuntimeException
あり、その下に次のような青いリンクを含む行があるはずです。
そのCaused by:
下のどこかに青いテキストのある行がない場合は、ある別の行を探してくださいCaused by:
。
その青いリンクをクリックします。問題が発生した場所に移動するはずです。私の場合、それはこの行によるものでした:
throw new RuntimeException();
だから、なぜそれがクラッシュするのかがわかりました。自分で例外を投げているからです。これは明らかなエラーでした。
ただし、別のエラーが発生したとしましょう。
java.lang.NullPointerException
私は自分のlogcatをチェックし、それが私に与えた青いリンクをクリックしました、そしてそれは私をここに連れて行きました:
mTextView.setText(myString);
だから、今私はデバッグしたいと思います。このStackOverflowの質問によると、NullPointerExceptionは何かがであると言いnull
ます。
それでは、nullとは何かを調べてみましょう。2つの可能性があります。mTextView
null、またはnullのいずれかですmyString
。調べるために、mTextView.setText(mString)
行の前に、次の2行を追加します。
Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);
ここで、以前に行ったように(VeroseをErrorに変更しました)、「Error」を「Debug」に変更します。デバッグでログを記録しているので。すべてのLogメソッドは次のとおりです。
Log.
d means Debug
e means error
w means warning
v means verbose
i means information
wtf means "What a terrible failure". This is similar to Log.e
を使用したので、Log.d
デバッグでチェックインしています。そのため、デバッグに変更しました。
NoticeLog.d
には最初のパラメータがあります。この場合は「AppDebug」です。logcatの右上にある[フィルターなし]ドロップダウンメニューをクリックします。[フィルター構成の編集]を選択し、フィルターに名前を付け、[ログタグ]に[アプリのデバッグ]を入力します。「OK」をクリックします。これで、logcatに次の2行が表示されます。
yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false
これで、mTextViewがnullであることがわかりました。
私は自分のコードを観察しましたが、今何かに気づきました。
私はprivate TextView mTextView
クラスのトップで宣言しました。しかし、私はそれを定義していません。
基本的に、onCreate()でこれを行うのを忘れました:
mTextView = (TextView) findViewById(R.id.textview_id_in_xml);
それでは、だからこそmTextView
、私はそれが何であるかを私のアプリを伝えるのを忘れているので、nullです。その行を追加してアプリを実行すると、アプリがクラッシュしなくなります。
このポップアップは、アプリの実行を停止する致命的な例外がコードで発生した場合にのみ表示されます。これは、任意の例外可能性がありNullPointerException
、OutOfMemoryException
など
スタックトレースを読み取ってアプリの原因を確認する簡単な方法であるAndroidStudioでアプリを開発している場合は、Logcatを使用して確認するのが最善の方法です。
アプリがすでに公開されている場合は、logcatを使用できません。したがって、そのためにCrashlytics
、発生した例外のバグレポートを提供するように実装できます。
ご確認Logcat
のメッセージを、あなたの参照Manifest
ファイルを。Activity,
ユーザー権限の定義など、何か足りないものがあるはずです。
次のツールのいずれかを使用できます。
adb logcat
adb logcat> logs.txt(エディターを使用してエラーを開いて検索できます。)
eclipse logcat(eclipseに表示されない場合は、[Windows]-> [ビューの表示]-> [その他]-> [Android]-> [LogCat]に移動します)
AndroidデバッグモニターまたはAndroidデバイスモニター(コマンドモニターを入力するか、UIから開きます)
- Android Studio
Android DebugMonitorの使用をお勧めします。それは良いことです。ログが多すぎるとEclipseがハングし、adblogcatフィルターを介してすべてが困難になるためです。
あなたはチェックする必要があります Stack trace
どうやってするか?
IDEでLOGCATからウィンドウを確認します
logcatウィンドウが表示されない場合は、このパスに移動して開きます
window->show view->others->Android->Logcat
Google-Apiを使用している場合は、このパスに移動します
adb logcat> logcat.txt
以下のshowToast()メソッドでは、コンテキストまたはアプリケーションコンテキストに別のパラメーターを渡して、試してみる必要があります。
public void showToast(String error, Context applicationContext){
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.custom_toast, (ViewGroup)
findViewById(R.id.toast_root));
TextView text = (TextView) findViewById(R.id.toast_error);
text.setText(error);
Toast toast = new Toast(applicationContext);
toast.setGravity(Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(view);
toast.show();
}
強制終了に遭遇したとき(アプリが機能しなくなったとき)の基本的なLogcat分析を共有しましょう。
ドキュメント
ログを収集/分析するためのAndroidの基本的なツールはlogcatです。
logcatに関するAndroidのページはこちらです
android Studioを使用している場合は、このリンクも確認できます。
キャプチャ
基本的に、次のコマンドを使用してlogcatを手動でキャプチャできます(またはAndroidStudioのAndroidMonitorウィンドウを確認するだけです)。
adb logcat
コマンドに追加できるパラメータはたくさんあり、必要なメッセージをフィルタリングして表示するのに役立ちます...これは個人的なものです...私は常に以下のコマンドを使用してメッセージのタイムスタンプを取得します。
adb logcat -v time
出力をファイルにリダイレクトして、テキストエディタで分析できます。
分析
アプリがクラッシュしている場合は、次のようになります。
07-09 08:29:13.474 21144-21144/com.example.khan.abc D/AndroidRuntime: Shutting down VM
07-09 08:29:13.475 21144-21144/com.example.khan.abc E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.khan.abc, PID: 21144
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
at com.example.khan.abc.AudioFragment$1.onClick(AudioFragment.java:125)
at android.view.View.performClick(View.java:4848)
at android.view.View$PerformClick.run(View.java:20262)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5631)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
07-09 08:29:15.195 21144-21144/com.example.khan.abc I/Process: Sending signal. PID: 21144 SIG: 9
ログのこの部分には、多くの情報が表示されます。
- 問題が発生したとき:
07-09 08:29:13.475
問題がいつ発生したかを確認することが重要です...ログにいくつかのエラーが見つかる場合があります...適切なメッセージを確認していることを確認する必要があります:)
- クラッシュしたアプリ:
com.example.khan.abc
このようにして、どのアプリがクラッシュしたかがわかります(メッセージに関するログを確認していることを確認してください)
- どのエラー:
java.lang.NullPointerException
NULLポインタ例外エラー
- エラーに関する詳細情報:
Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
オブジェクトonBackPressed()
からメソッドを呼び出そうとしましたFragmentActivity
。しかし、そのオブジェクトはnull
あなたがそれをしたときでした。
スタックトレース:スタックトレースは、メソッドの呼び出し順序を示します...時々、エラーは呼び出し元のメソッドで発生します(呼び出されたメソッドでは発生しません)。
com.example.khan.abc.AudioFragment $ 1.onClick(AudioFragment.java:125)で
ファイルcom.example.khan.abc.AudioFragment.java
内のonClick()
メソッド内125
の行でエラーが発生しました:(スタックトレースはエラーが発生した行を示しています)
それはによって呼び出されました:
at android.view.View.performClick(View.java:4848)
によって呼び出されました:
at android.view.View$PerformClick.run(View.java:20262)
によって呼び出されました:
at android.os.Handler.handleCallback(Handler.java:815)
等....
概要概要
これは単なる概要でした...すべてのログが単純なわけではありませんが、エラーによって特定の問題が発生し、詳細にすべての問題が表示されます...アイデアを共有し、エントリレベルの情報を提供するだけです...
どうにかしてお役に立てれば幸いです...よろしく
LogCatを使用して、アプリがクラッシュする原因を見つけてください。
Android Studioを使用している場合にLogcatを表示するには、ALT +6 または
Eclipseを使用している場合は、 ウィンドウ->パースペクティブを開く->その他-LogCat
LogCatに移動し、ドロップダウンメニューからエラーを選択します。これには、デバッグに役立つすべての必要な情報が含まれます。それでも問題が解決しない場合は、質問の編集としてLogCatを投稿すると、誰かが助けてくれます。
何らかの理由でアプリが適切なスタックトレースなしでクラッシュした場合。最初の行からデバッグしてみて、クラッシュするまで1行ずつ実行してください。それからあなたは答えを得るでしょう、どの行があなたに問題を引き起こしているのか。おそらく、それをtry catchブロックにラップして、エラー出力を出力することができます。
このエラーメッセージは、スタックトレースやその他のエラーメッセージなしで、単独で取得することもできます。
この場合、Androidマニフェストが正しく構成されていることを確認する必要があり(ライブラリから発生するマニフェストのマージとライブラリから発生するアクティビティを含む)、マニフェストファイルのアプリケーションに表示される最初のアクティビティに特に注意を払う必要があります。
開発中のクラッシュ
私のお気に入りのツールlogviewを試して、ログを取得し、開発中に分析してください。Linuxで実行する場合は、
必ず実行可能としてマーク./logview
し./lib/logview.jar
てください。
気に入らない場合は、Android用の代替デスクトップログビューアがたくさんあります。
野生でのクラッシュ
ユーザーのデバイスで発生した未処理の例外のスタックトレースを取得するために、FirebaseCrashlyticsなどのリアルタイムのクラッシュレポートツールを統合します。
現場でのバグの処理について詳しくは、バギーアプリをリリースする方法(およびライブで物語を伝える方法)をお読みください。
人々は間違いを犯すので、コーディングも同様です。
何かerror
が起こったときは、常に赤い色のテキストでlogcatに確認してください。ただし、赤い色のテキストに下線が付いた青い色のテキストの実際の問題を見つけることができます。
uが新しいを作成する場合はactivity
、常にファイルでを宣言activity
してくださいAndroidManifest
。
権限を追加する場合は、AndroidMainifest
ファイルでも宣言します。
Logcat - AndroidStudioの開発フェーズでログを確認します
最初にLogcatをクリアし、アプリを再度クラッシュさせて、クラッシュしたログの詳細のみを取得できるようにします。スタックトレースを確認する必要があります
残念ながら、MyAppは停止しました。それには多くの理由があります。あなたはログで同じことをチェックすることができます。これには、Log.e( "TAG"、 "Message");を使用できます。
次のようなアプリのクラッシュ時の一般的なエラー:
- コーディングミス(キーワードの使い方の間違い)。
- プロパティ名が一致しません。
- サポートされていないプラグイン(多分)。
- 不一致バージョン(多分)。
- AndroidManifestファイルにアクティビティがありません。
- AndroidManifestファイルに権限がありません。
- 最も一般的なNullPointerException。
- 宣言されていますが、定義されていません。
アプリのクラッシュエラーを解決するには:
- 上記の点に留意し、それを通過してください。
- エラーがあると、ファイル名も青色で表示されます(それらをクリックして、エラーが発生しているコードにジャンプします)。
まず、アプリがクラッシュした場所と理由を確認する必要があります。(Unfortunately, MyApp has stopped.).
の助けを借りてLOG
、何が悪かったのかを把握できます。
その後、アプリが停止したポイントを見つけて、そのポイントから修正します。
ターミナルに興味深いログがない場合(またはアプリに直接関連していない場合)、問題はネイティブライブラリが原因である可能性があります。その場合は、ターミナル内の「トゥームストーン」ファイルを確認する必要があります。
トゥームストーンファイルのデフォルトの場所はすべてのデバイスによって異なりますが、その場合は、次のようなログが表示されます。 Tombstone written to: /data/tombstones/tombstone_06
詳細については、https://source.android.com/devices/tech/debugを確認してください。
また、ターミナルでこのコマンドを実行すると、問題を見つけるのに役立ちます。
gradlew build > log.txt 2>details.txt
次に、上記の2つのログファイルを読み取ってgradlewファイルの場所に移動する必要があります。