我遇到以下代码问题。首先,我是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中查看错误消息?
答案 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)。