Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java执行';捕捉';块没有错误,但仍以某种方式运行';试试';块_Java_Android - Fatal编程技术网

Java执行';捕捉';块没有错误,但仍以某种方式运行';试试';块

Java执行';捕捉';块没有错误,但仍以某种方式运行';试试';块,java,android,Java,Android,我对以下代码有问题。首先,我是一名Java新手,具有多种其他语言的经验 当我在Android上运行以下命令时,它在“in.close();”处出错,跳转到catch块并运行Return“”;问题是,函数不返回空字符串,它成功地返回正确的json数据,即使调试器说它没有运行return json,而是运行return“” 到底发生了什么?为什么我的代码在Android上运行时出错,而在Java控制台上运行时却很好?为什么当它出错时,它不返回错误应该返回的内容;还有空字符串?如何在Android中查

我对以下代码有问题。首先,我是一名Java新手,具有多种其他语言的经验

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

到底发生了什么?为什么我的代码在Android上运行时出错,而在Java控制台上运行时却很好?为什么当它出错时,它不返回错误应该返回的内容;还有空字符串?如何在Android中查看错误消息?

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


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

读取器读取文本,即输入流二进制数据。桥接器InputStreamReader需要字符编码,并且在您的情况下采用默认的OS编码

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

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

由于JSON最好是在UTF-8中,我已经给出了这一点。但是Android上的默认编码是UTF-8,您可能需要使用Cp1252。因此,可能还有其他错误。

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

编辑

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

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

将此设置为“始终”或“提示”。(如果以前从未发生过,你可能会 已在运行模式下运行,因此采用了您不希望的优化。优化器可能已将这两个返回语句组合成一个语句。)更改此设置后,您永远不会看到断点出现在与设置断点的行不同的行上。请用新设置再次检查您的发现


如果出于任何原因您不想在调试模式下运行,也有另一种中断异常(捕获异常时挂起)的方法不受此类优化的影响。

您应该确保包括

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

您的
androidManifext.xml
中的权限

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

您是否在清单文件中设置了Internet权限?是否确实收到错误?您可以对异常调用
e.printStackTrace()
,以获取异常的确切类型以及发生在哪一行。这适用于普通java和Android(在Android上,它显示在LogCat中)。在返回之前,我在catch块中添加了e.printStackTrace(),但在LogCat中没有显示任何内容。如果函数正确返回json,并且没有输出错误,那么为什么调试器在catch块中返回时在断点处中断?还有另一个Log.e()方法:。它也可以用于记录异常。当我在返回之前的catch块中使用它时,我的LogCat中没有显示任何异常,即使调试器在返回时中断。我的LogCat(位于其中)中的唯一内容是:?::W/?(?):无法打开日志设备“/dev/log/main”:没有这样的文件或目录连接了设备吗?甚至是模拟器?然后进入“DDMS透视图”,在列表中单击它,然后单击“窗口/显示视图/日志猫”…我正在使用我已连接的手机。日志Cat在调试选项卡和DDMS选项卡中可见。日志猫中没有显示任何内容。我正在使用:catch(异常e){Log.e(“getJSON”,e.getMessage());return”“;}您是否尝试在catch子句中设置断点并以调试模式运行项目?这是了解发生了什么的最好方法…它包含在内,并在Android中成功返回json数据,但它跳转到catch块并运行return“”,但函数实际上仍然以某种方式返回json数据,而不是空字符串。您应该清理项目并重试。Android调试器有时会做一些奇怪的事情。即使我只在catch块的return“”上放置了一个断点,它仍然会在catch块上中断。try块中没有断点。@Fase-在这种情况下,我可以向您保证返回空字符串。但是,堆栈中可能还有另一个catch块试图重试。不会返回空字符串。返回URL中的json。我可以在调试器中看到json,并且程序将从json加载图像。它可以保证返回json。@Fase-我相信您的报告,但Java不会这样做。一旦抛出异常,try块的return语句将永远不会执行。在
catch
块中,唯一能胜过
return
的是后续
finally
块中的
return
。如果你有更多的上下文(调用代码),这可能会有帮助。我理解这是不可能的,因为我对其他语言的经验。这就是为什么我感到困惑。我想我必须上传一些图片来证明这一点?
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
<uses-permission android:name="android.permission.INTERNET" />