我很确定我错过了一些非常明显的东西,但这看起来很奇怪。
我正在使用Eclipse为Android开发 - 我有一个类似于我正在调试的方法,它正在做一些相当奇怪的事情......
public boolean test() {
if (variable == value)
return true;
// more code appears here
return false;
}
单步执行,在第一行(if语句)上,调试器建议变量确实等于值(它们都是两个字节变量,值为0) - 调试器然后移动到第二行(返回)是的,但它然后移动到最后一行(返回false) - 跳过中间的所有内容!?
返回的值为'false'
WTF正在那里?我假设RETURN将完全退出该方法 - 但调试器(以及返回的返回值 - 为false)表明它没有做任何类似的事情!?
我想念的是什么让我盯着我?返回语句是最后一行方法总是执行还是什么?
P.S。有趣的更新...
我正在使用的变量是在代码中分配的,我没有编写 - 我只是挖出源代码并重新构建/重新运行调试器并访问该源代码,我在其中找到了这一行< / p>
byte variable = (byte)9;
你能看到有什么不对吗,这或许可以解释你认为的问题!?我通过电子邮件发送了作者,但同时 - 呃.......
UPDATE2
好的,我已经完全重新制作了项目,清理并重建了它,卸载并重新安装到手机中,调试器现在表现得更加明智......
问题显然是'9'的使用(他们在一个字节中使用0-9作为可能的值!!) - 现在发生的事情是虽然调试器建议'变量'为“0” - 但它也失败了与(byte)0的比较,因此我得到一个'false'返回 - 这实际上是正确的。
我显然陷入困境,直到他们改变他们的代码以使用短片 - 至于接受答案,因为'重建一切'答案而且'比较使用(字节)或字节值()'答案是排序的 - 这是很棘手的 - 两个都对!?
答案 0 :(得分:7)
如果它们是用new分配的Byte对象,那么==将测试它们是否是内存中的同一对象并返回false。尝试使用:
variable.byteValue() == value.byteValue()
代替。
答案 1 :(得分:6)
我认为你的问题是,当你使用Byte对象时,执行==不是比较字节的VALUES,而是比较内存中的对象。这类似于String works。
相反,请尝试:
public boolean test() {
if (variable.equals(value))
return true;
// more code appears here
return false;
}
根据评论进行更新
如果要比较两个字节(特别是变量和值),请确保在两个值上都转换为一个字节(有关原因,请参阅Binary Numeric Promotion)。所以,试试:
public boolean test() {
if ((byte)variable == (byte)value)
return true;
// more code appears here
return false;
}
答案 2 :(得分:2)
我不认为eclipse中的代码缓冲区与正在调试的内容匹配。你应该看到代码执行超过return语句的唯一一次是你正在使用finally块,在调试器中的return语句之后你会看到代码在finally块中执行。
答案 3 :(得分:1)
返回语句是否始终执行或最后一行方法 什么?
没有
尝试围绕{}
中的if块,然后看看会发生什么。
答案 4 :(得分:1)
您对代码的描述与您粘贴的代码不符。我怀疑这是真正问题的症状:您正在逐步执行与编译代码不同的源代码。行号不匹配。所以看起来它正在做各种古怪的事情。重新编译已编译的代码并再次调试。
答案 5 :(得分:0)
逻辑上,return语句会立即退出方法 -
但在此之前,其他事情可能会发生,比如在封闭的try块之后的finally语句。
通常,调试器将跳转到return语句之后的方法的右括号,而不是最后一个return语句。
这让我觉得您的方法有些不寻常,或者您在调试器中看到的方法与设备上运行的方法不同。
答案 6 :(得分:0)
它不应该这样做,你对返回的了解是正确的。
当编译的二进制文件与源代码不同时,可能会发生这种情况。尝试清理项目并重建它。
答案 7 :(得分:0)
您可以尝试删除“此处显示更多代码”并逐行添加此代码,直到您发现错误为止。还可以尝试重启eclipse,清理项目并重新部署应用程序。
答案 8 :(得分:0)
使用Eclipse调试器这种行为是正常的。我建议你观察方法本身返回的值,而不是正在执行的代码(它将是真的,而不是假的)。
例如,尝试以下代码。您将看到返回true,但后来foo和foo2未初始化(虽然它似乎达到返回false)。
public boolean test() {
if (variable == value)
return true;
int foo = 5;
int foo2 = 7;
// more code appears here
return false; }
答案 9 :(得分:-3)
在“if”语句后,我没有看到一个开括号。它应该是这样的:
public boolean test() {
if (variable == value) {
return true;
// more code appears here
}
return false;
}
使用附加括号时,“true”仅与IF条件相关联,并且只有在不满足IF条件时才会出现false。