我使用Java 8进行项目
我们有一个与此类似的阴性测试:
public Integer g(Object data)
{
try
{
Double d = (Double)data;
}
catch(ClassCastException ex)
{
if( ex.getMessage() == null )
{
return 1;
}
}
return 0;
}
@Test
public void h()
{
Integer count = 0;
for( Integer idx = 0; idx < 100000; idx++ )
{
// The test
count += g(0.7312345f);
}
System.out.println("Total ClassCastException's with null message: "+count);
}
否定测试期望带有消息“ java.lang.Float无法强制转换为java.lang.Double”的异常java.lang.ClassCastException,并且有时会得到空消息
我试图在eclipse中调试它,但是以某种方式将其附加到调试器后,异常和消息始终如预期
运行AxelH在OpenJDK 8中给出的完整示例,表明我的怀疑是正确的。
复制,因此它不会消失(他说他将删除):
public class Main{
int cnt = 0, cntNull = 0;
public static void main(String[] args) {
new Main().test();
}
public void test(){
for( Integer idx = 0; idx < 200000; idx++ )
{
loseType(0.45642f, idx);
}
System.out.println(cnt + " error");
System.out.println(cntNull + " null");
}
public void loseType(Object data, Integer i){
try{
gainType((Double)data);
} catch(ClassCastException e){
cnt++;
if(e.getMessage() == null){
cntNull++;
}
}
}
public void gainType(Double x){
}
}
进行编译,javac Main.java
然后使用java -Xmixed Main
(与default相同java Main
)运行,并且您的异常通常具有空消息。运行它,java -Xint Main
它永远不会null
。
原因是在混合模式下,它使用运行时解释器,直到编译该类,然后再移至该类,但是使用-Xint
使其始终使用解释器,该消息始终存在。似乎已编译的本机代码存在一个错误,该错误会在没有正确消息的情况下创建异常。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句