2011-11-14 29 views
1

我很确定我错过了一些非常明显的东西,但这看起来很奇怪。Java方法 - RETURN实际上意味着什么?

我使用Eclipse开发Android - 和我有类似的方法,而我是调试和它做一些非常奇怪...

public boolean test() { 
    if (variable == value) 
     return true; 
    // more code appears here 
    return false; 
} 

通过步进,在第一行( if语句),调试器建议变量的值确实相等(它们的字节变量值都为0) - 然后调试器移动到第2行(返回值为true),但它会移至最后一行(返回false) - 跳过一切inbetween!?

返回的值为'false'

WTF正在那里?我假设RETURN将完全退出该方法 - 但调试器(以及返回的值被返回 - 为false)表明它没有这种做法!?

我在想什么,这是盯着我的脸?返回语句是最后一行方法总是执行还是什么?

p.s.有趣的更新...

我使用的变量被分配在代码中,我没有写 - 我只是挖出来的源代码,并重新构建/重新运行调试器访问该源和我发现这条线

byte variable = (byte)9; 

你能看到任何错误的,并且这也许可以解释你认为的问题!?我已经通过电子邮件发送笔者但同时 - 嗯....

UPDATE2

OK,我已经完全重拍的项目,清理和重建它,卸载和重新安装它插入手机和调试器现在的行为更明智的...

问题显然是使用'9'(它们使用0-9作为可能的值在一个字节!!) - 现在发生的事情是,尽管调试器建议“变量”是“ 0“ - 它与(字节)0的比较失败,因此我得到一个'假'返回 - 这实际上是正确的。我很明显坚持,直到他们改变他们的代码使用一个简短的 - 作为接受一个答案,这是非常棘手的'重建一切'的答案和比较使用(字节)或bytevalue()'的答案是排序 - 都是对的!?

+5

它不应该这样做,不。如果你清理项目,你还会观察这种行为吗? – Craigy

+2

您发布的代码与您在程序中的代码不同。尝试复制粘贴。 –

+0

有趣的你应该提及清洁 - 我敢肯定,我看到了这样的事情之前,一个完整的清洁和重建固定它 - 但 - 在这种情况下,它似乎像这样卡住... – shrewdlogarithm

回答

2

我不认为你的eclipse中的代码缓冲区与正在调试的内容相匹配。唯一一次你应该看到代码执行超过return语句的时候,你使用的是finally代码块,你会看到代码在调试器中的return语句之后的finally代码块中执行。

+0

我正在重新创建项目,现在清理并重新构建整个shebang以消除(明显的)可能性 - 但是我添加的额外代码也可能包含与Eclipse/Android /调试器无关的线索。 – shrewdlogarithm

+0

我接受这个答案很简单,因为它是这样做的,它指出我真正的问题(过度使用字节值) - 我知道这似乎不公平,但他是任何人的'最正确':) – shrewdlogarithm

1

返回语句作为总是执行的方法的最后一行还是 什么?

尝试围绕{}你如果块,然后看看会发生什么。

+0

我试过了 - 完全相同的处理,调试器通过'返回true'然后到'return false' - 该方法返回false。 – shrewdlogarithm

+1

我会建议Luchian说什么。粘贴你的完整代码,让我们看看它。 – prolink007

7

如果它们是用new分配的Byte对象,那么==会测试它们是否在内存中是同一个对象并返回false。尝试使用:

variable.byteValue() == value.byteValue() 

改为。

+0

我用类型欺骗 - 他们是字节,而不是字节... – shrewdlogarithm

+0

好吧,但如果你正常运行你的应用程序(不与调试器)是否返回true或false? – Tudor

+0

运行正常之前(我现在正在重建)产生了奇怪而美妙的结果 - 与获得'虚假'回报一致(理论上,除非我通过了意想不到的价值,否则它应该永远不会达到那个声明 - 请参阅我的编辑以获取详细信息) – shrewdlogarithm

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;  
} 
+0

对不起 - 我的错误错字 - 它们是字节而不是字节变量 - 所以==会起作用 – shrewdlogarithm

+0

@JohnPeat - 根据您的反馈更新了我的回复。检查一下,看看它是否对你有帮助。 – JasCav

0

从逻辑上讲,一个return语句并立即退出method--

但它确实之前,其他的事情可能发生,就像一个封闭的try块后finally语句。

通常,调试器将在return语句之后跳到方法的左括号,而不是最后一个return语句。

这让我觉得你的方法有一些不寻常的东西,或者你在调试器中看到的方法与设备上运行的方法不一样。

0

它不应该这样做,你知道的回报已经是正确的。

当编译后的二进制文件与源代码不同时,会发生这种情况。尝试清理您的项目并重建它。

0

您可以尝试删除“此处显示更多代码”并逐行添加此代码,直到您发现错误。另外,请尝试重新启动eclipse,清理项目并重新部署应用程序。

-3

我的“if”语句后没有看到一个开放的括号。它应该是这样的:

public boolean test() { 
    if (variable == value) {  
     return true; 
    // more code appears here 
    } 
    return false; 
} 

通过附加括号中的“真”将只与IF条件相关,假将是只有当IF条件不满足。

+1

'{}'是不是必需的。 – prolink007

+0

您可能需要移动“返回true”因为“更多的代码”部分将无法到达。 – LarsTech

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; } 
相关问题