我在 java 程序中看到一些非常奇怪的行为。失败是不可重现的,所以我所要做的就是原始日志。
该类看起来像这样:
public class MyClass {
public static final String MY_CONSTANT_STRING = "This should never change";
public boolean checkEndsWithCS(String inString) {
return inString.endsWith(MY_CONSTANT_STRING);
}
public String getString() {
return "Some text '" + MY_CONSTANT_STRING + "' some more text";
}
}
在日志中,我看到 getString 返回“Some text '' some more text”和 checkEndsWithCS("这些不是您要查找的字符。") 返回 true 的情况。
在这种情况下,我只能得出结论 MY_CONSTANT_STRING 是 "" 。
没有其他类扩展 MyClass,因此它不会在更高级别的类中被覆盖。
我在日志中没有看到任何内存不足的迹象,这似乎是最可能的原因。
它是静态最终的,所以引用不应该改变。字符串是不可变的,所以字符串不应该改变。
问题:
- 这些什么时候执行?我在eclipse中设置了一个断点,它永远不会被击中。
- 静态最终引用中的不可变字符串是否有任何可能的方法来更改?
- 有没有什么可能的方法让字符串不被首先分配?
- 是否有任何方式包含字符串或引用的内存可能会被其他对象或进程“破坏”?
- 任何其他微妙的陷阱,我只是没有以正确的方式思考这个问题?
如果这里的集体经验不能打破这个松散,那么我只会把它当作我的数据有问题的迹象,并从那个角度检查它。