java.lang.ClassCastException 消息和原因为空
java.lang.ClassCastException with null message and cause
我在使用 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.ClassCastException 和消息 "java.lang.Float cannot be cast to java.lang.Double",它有时会得到空消息
我试图在 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
编译(与默认 java Main
相同),您的异常通常有一个空消息。 运行 它与 java -Xint Main
永远不会 null
.
原因是在混合模式下它使用 运行time 解释器直到 class 被编译,然后移动到它,但是使用 -Xint
使得它总是使用解释器, 其中消息始终存在。编译后的本机代码似乎有一个错误,该错误会在没有正确消息的情况下创建异常。
这不是 JVM 错误,它是一个功能 ;) - 请参阅 NullPointerException in Java with no StackTrace - 您需要将 -XX:-OmitStackTraceInFastThrow
选项添加到 JVM args,然后您将始终拥有堆栈跟踪(但异常抛出速度稍慢)。
我在使用 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.ClassCastException 和消息 "java.lang.Float cannot be cast to java.lang.Double",它有时会得到空消息
我试图在 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
编译(与默认 java Main
相同),您的异常通常有一个空消息。 运行 它与 java -Xint Main
永远不会 null
.
原因是在混合模式下它使用 运行time 解释器直到 class 被编译,然后移动到它,但是使用 -Xint
使得它总是使用解释器, 其中消息始终存在。编译后的本机代码似乎有一个错误,该错误会在没有正确消息的情况下创建异常。
这不是 JVM 错误,它是一个功能 ;) - 请参阅 NullPointerException in Java with no StackTrace - 您需要将 -XX:-OmitStackTraceInFastThrow
选项添加到 JVM args,然后您将始终拥有堆栈跟踪(但异常抛出速度稍慢)。