3

我对以下代码有疑问。首先,我是 Java 的新手,有其他几种语言的经验。

当我在 Android 上运行以下命令时,它在“in.close();”处出错,跳转到 catch 块并运行 Return“”;问题是,该函数不会返回一个空字符串,它成功地返回了正确的 json 数据,即使调试器说它没有运行 return json,但它正在运行 return "";

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());
}   

到底发生了什么?为什么我的代码在 Java 控制台中运行时在 Android 上运行会出错?为什么当它出错时它不返回错误应该返回的内容;和空字符串?如何在 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+"'");”,您将在 logcat 中看到您的 json...;)

关于您的异常,您在框架中有一个方法可以自动将异常记录在 logcat 中:“ myException.printStackTrace();

于 2012-05-14T14:33:33.483 回答
0

您的代码似乎是正确的。如果您确实看到返回了 JSON,那么您没有IOExceptionclose.

编辑

您更新的源代码清楚地表明这里没有返回finally或重试逻辑。好的。

在您的环境中访问以下设置:窗口/首选项/运行/调试/启动/“当工作区包含断点时以调试模式启动”

将此设置为AlwaysPrompt。(如果之前是Never,您可能一直在运行模式下运行,因此采用了您不想要的优化。两个返回语句可能已被优化器合并为一个。)更改此设置后,您应该永远不会看到断点在与设置它的行不同的行处命中。请使用新设置仔细检查您的发现。

如果出于某种原因您不想在调试模式下运行,还有另一种中断异常的方法(Suspend On Caught Exceptions)不受这种优化的影响。

于 2012-05-14T14:35:55.353 回答
0

Reader 读取文本,InputStream 二进制数据。桥 InputStreamReader 需要字符编码,并在您的情况下采用默认的操作系统编码。

所以最好明确地使用编码:

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

由于 JSON 最好使用 UTF-8,我已经给出了这一点。但是 Android 上的默认编码是 UTF-8,你可能是 Cp1252。所以也可能有其他问题。

于 2012-05-14T14:34:12.877 回答