3

次のコードに問題があります。まず、私はJavaの初心者で、他のいくつかの言語の経験があります。

Android で以下を実行すると、「in.close();」でエラーになり、catch ブロックにジャンプして Return ""; を実行します。問題は、関数が空の文字列を返さないことです。デバッガーが return json を実行していないと言い、return ""; を実行していると言っても、正しい json データを正常に返します。

public void fetch() {

    // Get the JSON of the image gallery
    String json = getJSON();

    // json somehow has the actual correct json data and not an empty string!

};

private String getJSON() {

    try {
        // Create a URL for the desired page
        URL url = new URL("http://imgur.com/gallery.json");

        // Read all the text returned by the server
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
        String json = in.readLine();
        in.close();
        return json; // <-- debugger doesn't break here!
    }
    catch(Exception e) {
        Log.e("getJSON", e.getMessage());
        return ""; // <-- debugger breaks here! Cat Log shows nothing!
    }
}

まったく同じコードを Java コンソールにコピーして、エラー メッセージを出力し、ブレーク ポイントを使用してデバッガーで確認できるようにします。コードはエラーなしで実行されます。

    try {
        // Create a URL for the desired page
        URL url = new URL("http://imgur.com/gallery.json");

        // Read all the text returned by the server
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        String json = in.readLine();
        in.close();
        System.out.println(json);
}
catch(Exception e) {
    System.out.println(e.getMessage());
}   

正確には何が起こっているのですか?Android でコードを実行すると、Java コンソールで問題なく実行できるのにエラーが発生するのはなぜですか? エラーが発生したときに、エラーが返すはずのものを返さないのはなぜですか。と空の文字列?Android でエラー メッセージを表示するにはどうすればよいですか?

4

4 に答える 4

2

必ず含める必要があります

<uses-permission android:name="android.permission.INTERNET" />

あなたの許可androidManifext.xml

リモートの場所からデータを取得しようとしています。Java コンソールでは、そのような権限がなくても実行できますが、Android ではできません。

于 2012-05-14T14:36:47.727 に答える
0

Android の「System.out.println」は忘れてください。Eclipse で「Logcat」ビューを使用できます。これは、デバイスから必要なすべてのログを表示するために使用されます。また、" System.out.println(json);" を " " に置き換えるLog.e("MyApp", "Here is my Json: '"+json+"'");と、json が logcat に表示されます... ;)

あなたの例外について、logcat: " myException.printStackTrace();"に例外を自動的に記録するメソッドがフレームワークにあります。

于 2012-05-14T14:33:33.483 に答える
0

Reader はテキスト (InputStream バイナリ データ) を読み取ります。ブリッジ InputStreamReader には文字エンコーディングが必要であり、ケースではデフォルトの OS エンコーディングを使用します。

したがって、エンコーディングを明示的に使用することをお勧めします。

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));

JSONはUTF-8の方が良いので、それを与えました。しかし、Android のデフォルトのエンコーディングは UTF-8 で、おそらく Cp1252 です。したがって、他にも何か問題がある可能性があります。

于 2012-05-14T14:34:12.877 に答える
0

あなたのコードは正しいようです。JSON が返された場合は、IOExceptionから何も取得していませんclose

編集

更新されたソース コードは、finallyここで動作しているロジックからの戻りまたは再試行がないことを明確に示しています。良い。

お使いの環境で次の設定にアクセスしてください: Window / Preferences / Run/Debug / Launching / "Launch in debug mode when workspace contains breakpoints"

これをAlwaysまたはPromptに設定します。(以前はNeverであった場合は、実行モードで実行していた可能性があり、そのため、望ましくない最適化を採用している可能性があります。2 つの return ステートメントがオプティマイザーによって 1 つに結合されている可能性があります。) この設定を変更した後は、ブレークポイントが設定された行とは異なる行にヒットしました。新しい設定で調査結果を再確認してください。

何らかの理由でデバッグモードで実行したくない場合は、この種の最適化の影響を受けない、例外で中断する別の方法 (Suspend On Caught Exceptions) もあります。

于 2012-05-14T14:35:55.353 に答える