【问题标题】:Weird behavior of assertions in EclipseEclipse 中断言的奇怪行为
【发布时间】:2013-03-08 10:37:41
【问题描述】:

我在 Java (Eclipse) 中发现了一种奇怪的断言行为。简单的例子:如果我执行这个......

public static void main (String[] args) {
    assert(getA() == "a") : "Invalid";
    System.out.println("Assertion successful!");
}

private static String getA() 
{
    return "a";
}

...它会告诉我“断言成功!”正如它应该。但是,如果我尝试这个...

public static void main (String[] args) {
    assert(getA() + "b" == "ab") : "Invalid";
    System.out.println("Assertion successful!");
}

private static String getA() 
{
    return "a";
}

... 我得到一个 AssertionError。为什么这个 Assertion 不返回 true?

注意:

【问题讨论】:

  • 真正的问题是:为什么第一个 sn -p 不打印“无效”?
  • 这与JVM sp00m中的优化有关,在第一种情况下,“a”字面量每个占用相同的内存空间
  • @sp00m:见哈维尔的回答.. 哦,伙计,我最好多睡觉^^
  • 如果您认为某些核心 java 函数或库的行为像 assert 一样“奇怪”。这是 99.999% 的时间用户错误:)

标签: java eclipse behavior assertions


【解决方案1】:

你需要付出

"a".equals(getA());

第二种情况

"ab".equals("b".concat(getA()));

原因:- == 用于比较对象引用,而equals() 用于字符串值比较,这正是您所需要的。另外,第一个场景具有相同的字符串文字“a”,因此它返回true。但在第二种情况下,为 getA()+b 创建了一个新的 String 实例,这与文字 "ab" 不同。

【讨论】:

  • 打败我哈哈。当您执行 == 时,它会进行对象比较而不是字符串值比较。这可能会导致奇怪的比较。
  • 哦,不,就是这样!谢谢,太尴尬了! :D
  • 好吧,这里的这个例子怎么样?为什么会失败? pastebin.com/ZgA6bTjw
  • @RomanMächler 在该示例中,您正在比较两个字符串数组......完全不同的情况。有关该问题的答案,请参阅此链接:stackoverflow.com/questions/8777257/…
  • np,我认为这个问题的变体每天至少出现一次 SO :)
【解决方案2】:

"a" 是编译时的文字,然后"a"=="a" 评估为true

getA()+"b" 创建一个新的 String 实例,它不同于编译时文字 "ab"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多