REST API を介してクエリを実行するアプリの一部を実行しているときに突然 ClassCastException が発生し始めたとき、私のアプリはしばらくの間正常に動作しているように見えました。ある瞬間に機能していたので、どこから来たのか、なぜ今になって現れたのかわかりません。その後、別の検索クエリをテストするために再実行すると、エラーが発生しました。エラーは、次のメソッド、特にブロック内の最初の行を指していますtry
- JSONObject resultsWrapper = (JSONObject) new JSONTokener(json).nextValue();
:
private static void getResultsFromJson(String json) {
try {
JSONObject resultsWrapper = (JSONObject) new JSONTokener(json).nextValue();
JSONArray results = resultsWrapper.getJSONArray("results");
for (int i = 0; i < results.length(); i++) {
JSONObject result = results.getJSONObject(i);
String name = result.getString("from_user");
String geo = result.getString("text");
VenueList.addVenue(name, geo);
}
} catch (JSONException e) {
Log.e(TAG, "Failed to parse JSON.", e);
}
}
完全開示:VenueList
結果から返されたデータを格納するために構築されたクラスであり、グローバルにアクセスできます。必要に応じてコードを投稿できます。
エラーは、上記と同じ Fragment 内の次のメソッドも指しています。具体的にgetResultsFromJson(restResult)
は が呼び出された場所です。
public void onRESTResult(int code, String restResult) {
if (code == 200 && restResult != null) {
getResultsFromJson(restResult);
mResults = VenueList.venueNames;
setResults();
}
else {
Activity activity = getActivity();
if (activity != null) {
Toast.makeText(activity, "Failed to load Twitter data. Check your internet settings.", Toast.LENGTH_SHORT).show();
}
}
}
最後に、上記の 2 つのメソッドは、次の Fragment を拡張する Fragment 内にあります。ここで、エラーは特に ` onRESTResult(resultCode, resultData.getString(RESTService.REST_RESULT));' を指しています。
public abstract class RESTResponderFragment extends Fragment {
private ResultReceiver mReceiver;
public RESTResponderFragment() {
mReceiver = new ResultReceiver(new Handler()) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (resultData != null && resultData.containsKey(RESTService.REST_RESULT)) {
onRESTResult(resultCode, resultData.getString(RESTService.REST_RESULT));
}
else {
onRESTResult(resultCode, null);
}
}
};
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
public ResultReceiver getResultReceiver() {
return mReceiver;
}
abstract public void onRESTResult(int code, String result);
}
完全なエラー ログは次のとおりです。
04-16 22:20:16.270: E/AndroidRuntime(17906): FATAL EXCEPTION: main
04-16 22:20:16.270: E/AndroidRuntime(17906): java.lang.ClassCastException: java.lang.String
04-16 22:20:16.270: E/AndroidRuntime(17906): at com.example.blobtag2.fragment.FactualResponderFragment.getResultsFromJson(FactualResponderFragment.java:152)
04-16 22:20:16.270: E/AndroidRuntime(17906): at com.example.blobtag2.fragment.FactualResponderFragment.onRESTResult(FactualResponderFragment.java:106)
04-16 22:20:16.270: E/AndroidRuntime(17906): at com.example.blobtag2.fragment.RESTResponderFragment$1.onReceiveResult(RESTResponderFragment.java:23)
04-16 22:20:16.270: E/AndroidRuntime(17906): at android.os.ResultReceiver$MyRunnable.run(ResultReceiver.java:43)
04-16 22:20:16.270: E/AndroidRuntime(17906): at android.os.Handler.handleCallback(Handler.java:587)
04-16 22:20:16.270: E/AndroidRuntime(17906): at android.os.Handler.dispatchMessage(Handler.java:92)
04-16 22:20:16.270: E/AndroidRuntime(17906): at android.os.Looper.loop(Looper.java:150)
04-16 22:20:16.270: E/AndroidRuntime(17906): at android.app.ActivityThread.main(ActivityThread.java:4358)
04-16 22:20:16.270: E/AndroidRuntime(17906): at java.lang.reflect.Method.invokeNative(Native Method)
04-16 22:20:16.270: E/AndroidRuntime(17906): at java.lang.reflect.Method.invoke(Method.java:507)
04-16 22:20:16.270: E/AndroidRuntime(17906): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
04-16 22:20:16.270: E/AndroidRuntime(17906): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
04-16 22:20:16.270: E/AndroidRuntime(17906): at dalvik.system.NativeStart.main(Native Method)
これは、プロジェクトをビルドできないというエラーが発生したと同時に発生しました-「ビルド中にエラーが発生しました。プロジェクトでビルダー 'Android Package Builder'を実行中にエラーが発生しました」。
役に立つかもしれない他のコードがあれば教えてください。これはどこからともなく完全に発生したため、本当に混乱しています。これを修正する方法および/またはそれが発生した理由について、誰かが持っている洞察があれば幸いです. ありがとう!