2016-11-09 52 views
1

我使用Java 8java.lang.ClassCastException與空消息,並引起

我們有一個類似的負面測試一個項目:

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不能轉換爲java.lang.Double」,它有時會得到空的消息

我試圖在Eclipse中調試它,但以某種方式連接到調試器時,異常和消息按預期所有的時間

+0

你能否提供這個[mcve]。什麼是'//否則否定測試失敗.....' – AxelH

+0

用實際代碼替換僞代碼 –

+0

因此,您應該確定這是一個代碼,用於在沒有消息的情況下生成此異常「bug」。因爲這根本不清楚。 – AxelH

回答

2

運行OpenJDK 8中由AxelH給出的完整示例揭示了我的懷疑是正確的。

複製,因此它不會消失(他說他會刪除):

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

原因是在混合模式下,它使用運行時解釋器,直到類被編譯,然後移到它,但使用-Xint使它總是使用解釋器,其中消息始終存在。看起來編譯的本地代碼有一個缺陷,它會在沒有正確消息的情況下創建異常。

+0

我也檢查過,在eclipse和應用程序中,-Xint確實解決了這個問題,只是它慢了5倍或10倍(當然如預期的那樣) –

+0

接受並打算爲Java 8打開一個bug(這個問題也出現在最近的Java 8u112),在解釋器模式下工作的b/c非常慢。感謝AlexH和coladict –