Java执行'catch'块没有错误,并且仍以某种方式运行'try'块

时间:2012-05-14 14:28:06

标签: java android

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

当我在Android上运行以下命令时,它在“in.close();”处出现错误,跳转到catch块并运行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控制台上运行时在Android上运行错误就好了?为什么当它出错时它不会返回错误应该返回的内容;和空字符串?如何在Android中查看错误消息?

4 个答案:

答案 0 :(得分:2)

您应该确保包含

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

androidManifext.xml中的

权限。

您正尝试从远程位置检索数据。 在Java控制台上,您可以在没有此类权限的情况下执行此操作,但不能在Android中执行。

答案 1 :(得分:0)

忘掉Android中的“System.out.println”。 您可以在Eclipse中使用“Logcat”视图。这用于显示您希望从设备中获取的每个日志。 此外,您可以将“System.out.println(json);”替换为“Log.e("MyApp", "Here is my Json: '"+json+"'");”,然后您将在logcat中看到您的json ...;)

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

答案 2 :(得分:0)

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

因此,最好明确使用编码:

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

由于JSON最好是UTF-8,我已经给出了。但Android上的默认编码是UTF-8,可能还有Cp1252。所以可能还有其他错误。

答案 3 :(得分:0)

您的代码似乎是正确的。如果您确实看到了返回的JSON,那么您没有从IOException获得任何close

修改

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

访问您环境中的以下设置:Window / Preferences / Run / Debug / Launching /“当工作空间包含断点时以调试模式启动”

将此设置为始终提示。 (如果以前从不,你可能会 已经在运行模式下运行,因此采用了您不想要的优化。优化程序可能已将两个返回语句合并为一个。)更改此设置后,您永远不应该在与设置它的行不同的行上看到断点。请使用新设置仔细检查您的发现。

如果因为任何原因你不想在调试模式下运行,还有另一种方法可以打破不受此类优化影响的异常(Suspend On Caught Exceptions)。