Java String.equals即使为true也不会返回true

Java String.equals即使为true也不会返回true,java,compiler-optimization,Java,Compiler Optimization,我有一小部分简单的代码,但我不知道为什么我不能让它工作 tagName="Hello"; String value="Hello"; if (tagName!=null && tagName.equals(value)) { int io=0; } 标记名不为null,且明显等于value,但代码从未命中int io=0行 Java可能会优化您的赋值语句,因为它没有效果。您可以将System.out.println放入该块中,也可以将“int-io”移到if外部,只在块

我有一小部分简单的代码,但我不知道为什么我不能让它工作

tagName="Hello";
String value="Hello";
if (tagName!=null && tagName.equals(value))
{
    int io=0;
}

标记名不为null,且明显等于value,但代码从未命中int io=0行

Java可能会优化您的赋值语句,因为它没有效果。您可以将System.out.println放入该块中,也可以将“int-io”移到if外部,只在块内部进行赋值。

您确定要运行此代码吗?如果在if语句之前打印tagName.equalsvalue的值,会发生什么情况?if块中没有输出。尝试添加println语句或在其中调试是的,代码正在运行,我在io=0语句处设置了断点,我正在一步一步地调试它只是跳过if语句,就好像它返回了false一样。如果您感到困惑,则肯定会发生赋值。现在赋值是没有意义的,因为一旦你离开这个块,这个变量就消失了,所以这样做没有意义。谢谢你,这是优化,我不得不在里面放很多代码,但现在我只是用这个伪语句检查一下,如果代码在这里运行良好,我真的很困惑为什么它没有。现在,当我使块变得有意义时,断点命中得很好。必须说,这个java优化也令人惊讶和困惑。你是对的,shekhar suman,你发布了一个非常详细的回复,并提供了很多帮助,但我已经通过bmargulies的建议解决了这个问题,所以接受了这个建议,投了你的赞成票。如果我能接受两个答案,我肯定会这么做,我甚至会投票支持你的所有评论,以表示感谢。@shekharsuman你从侮辱OP“糟糕的设计”开始,这可能会导致一些不利的想法。但是当你删除它的时候,净投票数是0,所以我不确定所有的大惊小怪是怎么回事。@b我得到了我的错误,实际上我收到的只是我的错误。这与OP的问题无关,而是我的错误假设。如果OP有任何运行时异常,那么答案是否定的。他的回答是非常正确和合理的。。。
tagName="Hello";
String value="Hello";
if (tagName!=null && tagName.equals(value))
{
    int io=0;
}