Java方法 - RETURN实际意味着什么?

时间:2011-11-14 22:02:43

标签: java android methods

我很确定我错过了一些非常明显的东西,但这看起来很奇怪。

我正在使用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'返回 - 这实际上是正确的。

我显然陷入困境,直到他们改变他们的代码以使用短片 - 至于接受答案,因为'重建一切'答案而且'比较使用(字节)或字节值()'答案是排序的 - 这是很棘手的 - 两个都对!?

10 个答案:

答案 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。