Java方法-返回的实际含义是什么?
我很确定我错过了一些非常明显的东西,但这似乎很奇怪 我正在使用Eclipse为Android开发—我有一个类似于我正在调试的方法,它正在做一些非常奇怪的事情Java方法-返回的实际含义是什么?,java,android,methods,Java,Android,Methods,我很确定我错过了一些非常明显的东西,但这似乎很奇怪 我正在使用Eclipse为Android开发—我有一个类似于我正在调试的方法,它正在做一些非常奇怪的事情 public boolean test() { if (variable == value) return true; // more code appears here return false; } 在第一行(if语句)上,调试器建议变量的值确实相等(两个字节变量的值都为0)-调试器然后移到第
public boolean test() {
if (variable == value)
return true;
// more code appears here
return false;
}
在第一行(if语句)上,调试器建议变量的值确实相等(两个字节变量的值都为0)-调试器然后移到第二行(返回true),但随后移到最后一行(返回false)-跳过中间的所有内容
返回的值为“false”
WTF在那里进行什么?我假设RETURN将完全退出该方法-但是调试器(返回值被发送回来-为false)表明它不会执行类似的操作
我错过了什么,正盯着我的脸?返回语句作为方法的最后一行总是被执行吗
p、 有趣的更新
我使用的变量是在我没有编写的代码中分配的——我只是挖掘了源代码,重新构建/重新运行了调试器,并访问了该源代码,我在其中找到了这一行
byte variable = (byte)9;
你能看出这有什么问题吗?你认为这能解释问题吗!?我已经给作者发了电子邮件,但与此同时
更新2
好的,我已经完全重新制作了这个项目,清理并重建了它,卸载并重新安装到手机中,调试器现在的行为更加合理
问题显然是“9”的使用(它们使用0-9作为字节中的可能值!!)-现在发生的是,尽管调试器建议“variable”为“0”-它也无法与(byte)0进行比较,因此我得到了一个“false”返回值-这实际上是正确的
很明显,在他们将代码更改为使用简短的答案之前,我一直都很困惑,因为“重建所有内容”的答案和“使用(字节)或字节值()进行比较”的答案在某种程度上都是正确的
返回语句是否始终作为方法的最后一行执行
什么
没有
尝试在{}
中包围if块,然后看看会发生什么
返回语句是否始终作为方法的最后一行执行
什么
没有
尝试在
{}
中包围if块,然后看看会发生什么。如果它们是分配了new的字节对象,那么==将测试它们是否是内存中的同一对象,并返回false。尝试使用:
variable.byteValue() == value.byteValue()
相反。如果它们是用new分配的字节对象,则==将测试它们是否是内存中的同一对象,并返回false。尝试使用:
variable.byteValue() == value.byteValue()
相反。您对代码的描述与粘贴的代码不匹配。我怀疑这是真正问题的一个症状:您正在单步执行与编译代码不同的源代码。行号不匹配。看起来它在做各种古怪的事情。重新编译代码并再次调试。您对代码的描述与粘贴的代码不匹配。我怀疑这是真正问题的一个症状:您正在单步执行与编译代码不同的源代码。行号不匹配。看起来它在做各种古怪的事情。重新编译代码并再次调试。我认为您的问题在于,当您使用Byte对象时,执行==并不是比较字节的值,而是比较内存中的对象。这类似于 相反,请尝试:
public boolean test() {
if (variable.equals(value))
return true;
// more code appears here
return false;
}
根据评论进行更新
如果要比较两个字节(特别是一个变量和一个值),请确保在两个值上都强制转换为一个字节(请参阅原因)。因此,请尝试:
public boolean test() {
if ((byte)variable == (byte)value)
return true;
// more code appears here
return false;
}
我认为您的问题是,当您使用Byte对象时,执行==并不是比较字节的值,而是比较内存中的对象。这类似于 相反,请尝试:
public boolean test() {
if (variable.equals(value))
return true;
// more code appears here
return false;
}
根据评论进行更新
如果要比较两个字节(特别是一个变量和一个值),请确保在两个值上都强制转换为一个字节(请参阅原因)。因此,请尝试:
public boolean test() {
if ((byte)variable == (byte)value)
return true;
// more code appears here
return false;
}
从逻辑上讲,return语句确实会立即退出方法-- 但在此之前,可能会发生其他事情,比如在封闭的try块之后出现finally语句 通常,调试器会跳到return语句之后的方法的右大括号,而不是最后一个return语句
这让我觉得您的方法有些不寻常,或者您在调试器中看到的方法与设备上运行的方法不同。从逻辑上讲,return语句确实会立即退出方法-- 但在此之前,可能会发生其他事情,比如在封闭的try块之后出现finally语句 通常,调试器会跳到return语句之后的方法的右大括号,而不是最后一个return语句
这让我觉得您的方法有点不寻常,或者您在调试器中看到的方法与设备上运行的方法不同。它不应该这样做,而且您对return的了解已经是正确的
当编译的二进制文件与源代码不同时,可能会发生这种情况。尝试清理项目并重建它。它不应该这样做,而且您对return的了解已经是正确的
当编译的二进制文件与源代码不同时,可能会发生这种情况。尝试清理并重建项目。我认为eclipse中的代码缓冲区与正在调试的代码缓冲区不匹配。您应该看到代码在返回语句之后执行的唯一时间是您正在使用finally块,在该块中,您将看到代码在调试器中返回语句之后的finally块中执行。我不认为eclipse I中的代码缓冲区