10

ユーザーから送信されたクラッシュ レポートに基づいてバグの原因を突き止めようとしていますが、クラッシュ レポートの解釈方法に関する基本的なトレーニングが必要であるという結論に達しました。

例として、クラッシュ レポートは次のようになります。

java.lang.NumberFormatException: Invalid int: ""
    at java.lang.Integer.invalidInt(Integer.java:138)
    at java.lang.Integer.parseInt(Integer.java:358)
    at java.lang.Integer.parseInt(Integer.java:334)
    at java.lang.Integer.valueOf(Integer.java:525)
    at com.cloud3squared.meteogram.MeteogramService.cacheFileName(MeteogramService.java)
                                                    cacheBaseName(MeteogramService.java)
                                                    getAppWidgetId(MeteogramService.java)
                                                    createAdhocWidgetUpdateIntent(MeteogramService.java)
                                                    setupBasicClickStuff(MeteogramService.java)
                                                    setAdhocAppWidgetAlarm(MeteogramService.java)
                                                    setNextClockWidgetUpdateAlarm(MeteogramService.java)
                                                    cancelAppWidgetAlarm(MeteogramService.java)
                                                    cancelAppWidgetAlarms(MeteogramService.java)
                                                    logAction$3aaf2084(MeteogramService.java)
                                                    logActionAgainstAllWidgets$62dc3a79(MeteogramService.java)
                                                    updateAppWidget(MeteogramService.java)
                                                    showButtons(MeteogramService.java)
                                                    hideButtons(MeteogramService.java)
                                                    fetchOk(MeteogramService.java)
                                                    getViewId(MeteogramService.java)
                                                    putBitmapIntoWidget(MeteogramService.java)
                                                    lngNow(MeteogramService.java)
                                                    showNotification(MeteogramService.java)
                                                    showMessageInWidget(MeteogramService.java)
                                                    sharpen(MeteogramService.java)
                                                    removeFromRequestsList(MeteogramService.java)
                                                    removeFromRequestsList$204347ff(MeteogramService.java)
                                                                           MeteogramService.java)
                                                    displayStuffInWidget(MeteogramService.java)
                                                    access$000(MeteogramService.java)
                                                    access$100(MeteogramService.java)
                                                    access$300(MeteogramService.java)
    at com.cloud3squared.meteogram.MeteogramService$GetServerWidgetAsyncTask.onPostExecute(MeteogramService.java)
    at android.os.AsyncTask.finish(AsyncTask.java:651)
    at android.os.AsyncTask.access$500(AsyncTask.java:180)
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:224)
    at android.app.ActivityThread.main(ActivityThread.java:5526)
    at java.lang.reflect.Method.invoke(Method.java)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

これは に至る呼び出しの順序を示していNumberFormatExceptionますか? もしそうなら、どのような順序ですか? at行を下から上に読むのですか?accessネストされているのは何MeteogramServiceですか?...accessそのクラスにはメソッドがありません。どの関数内でNumberFormatException実際に発生するかを判断するにはどうすればよいですか? 論理的に言うと内部cacheFileNameですが、そのような例外につながる可能性のあるものは何もありません... aStringから an への解析はintその前に発生します... 解析された int は単に に渡されcacheFileNameます。

感謝して受け取った助け。

編集

以下のコメントで参照する追加のコード スニペット:

static String cacheFileName(Context context, int appWidgetId, int pxWidth, int pxHeight) {
    String fileName = cacheBaseName(appWidgetId) + "_" + pxWidth + "x" + pxHeight + ".png";
    logAction(context, appWidgetId, "cacheFileName " + fileName, TAG);
    return fileName;
}

static String cacheBaseName(int appWidgetId) {
    return (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) ? "widget_" : "widget_" + appWidgetId;
}
4

4 に答える 4

3

上から下から上への両方を読む必要があります。

通常、上から下に向かってより具体的になります。

TOP から: 例外の正確な原因を見つけることができます

この場合、どちらがjava.lang.NumberFormatExceptionで爆発するcacheFileNamecacheBaseName

下から: 問題の一般的な領域を見つけることができます

GetServerWidgetAsyncTask.onPostExecute

これが私に見えるのは、AsyncTask のバックグラウンド作業で終了した何らかの値が不適切にフォーマットされ、onPostExecute で int として使用されている可能性があるということです。

pxWidthまず始めに、 、pxHeight、およびappWidgetIdinの値をデバッグします。String fileName = cacheBaseName(appWidgetId) + "_" + pxWidth + "x" + pxHeight + ".png";

Integer.valueOfおそらく、文字列を int に解析しようとしていたことを意味します。例: String "13" into int 13.

これらの 3 つの変数のうち、最も可能性の高い関係は です。appWidgetIdこれについては別のヒントがありgetAppWidgetIdます。ただし、3 つすべてをログに記録してください。=)

于 2016-09-02T17:09:02.620 に答える
2

これは NumberFormatException に至るまでの呼び出しの順序を示していますか?

はい、このスタック トレースは、例外に至る呼び出しの順序を確実に示しています。メソッド呼び出しの順序を知るためにスタックトレースを下から上に読んでください -

MeteogramService 内にネストされたアクセスとは何ですか?...そのクラスにはアクセス メソッドがありません

これらのアクセス メソッドは、内部クラスから外部クラスのメンバーにアクセスするために自動的に生成されるメソッドです。詳細については、Jake Wharton によるこのビデオを確認してください。

NumberFormatException が実際にどの関数内で発生するかを判断するにはどうすればよいですか

スタック トレースですべてのメソッド呼び出しを確認します。一番上のものは、どのメソッドから例外が最初にスローされたかを示します。したがって、スタック トレースを確認すると、2 行目から 4 行目のメソッド呼び出しは、定義されていないクラスである Integer.java クラスからのものですが、例外はこのクラスから開始されます。ここで 5 行目に来ると、次のメソッド呼び出しが であることを明確に示していますMeteogramService.cacheFileName()。したがって、このメソッドから何かを実行しようとすると例外が発生します。

そのような例外につながる可能性のあるものは何もありません

スタック トレースを注意深く読んでください。一番最初の行でそれは言いjava.lang.NumberFormatException: Invalid int: ""ます。これは、空の文字列または "" を整数クラスに渡していることを意味します。メソッドが呼び出されたと表示される前MeteogramService.cacheFileName()に行を確認すると、java.lang.Integer.valueOf()

したがって、結論は、有効な整数ではない空の文字列で valueOf() メソッドを呼び出しているため、NumberFormatException

于 2016-09-01T04:09:41.873 に答える
0

私は他の人に同意します、

通常、クラッシュ レポートでは、例外 (この場合は ) を探し、NumberFormatException次にクラス パッケージ名を探します。

パッケージがcom.cloud3squared.meteogram.であると仮定すると、問題は Meteogram Service にあり、使用方法がInteger.parseInt()間違っています。

Integer.parseInt()の場合、「3」や「5」などの数字を含む文字列が必要であることに注意してください。これがない場合、メソッドはNumberFormatException. あなたのcacheFileName()クラスでそのメソッド呼び出しが見当たらないので、getAppWidgetID() やその他のメソッド呼び出しをスタック トレースで検索することをお勧めします。

于 2016-09-03T13:45:52.873 に答える