日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Bug分析之異常變量堆棧信息

異常是一種特殊的類,在創(chuàng)建異常時會保存創(chuàng)建時的方法調(diào)用堆棧鏡像。即,為了保留異常出現(xiàn)時的實時堆棧信息,不應(yīng)復(fù)用異常,每個異常均需單獨new方式生成。

在慶城等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站制作 網(wǎng)站設(shè)計制作按需定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,營銷型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè),慶城網(wǎng)站建設(shè)費用合理。

下面演示一段有問題的代碼并進行分析

1.問題代碼

a)自定義異常定義

 
 
 
  1. package demo.bce;  
  2. public class MyException extends RuntimeException {  
  3.     private static final long serialVersionUID = -3802919537257556719L;  
  4.     private String id;  
  5.     public MyException(String id) {  
  6.        super();  
  7.        this.id = id;  
  8.     }  
  9.     public String getId() {  
  10.        return id;  
  11.     }  
  12.     public void setId(String id) {  
  13.        this.id = id;  
  14.     }  
  15.     @SuppressWarnings("unused")  
  16.     private MyException() {  
  17.     }  

b)自定義異常常量

 
 
 
  1. package demo.bce;  
  2.    
  3. public final class MyExceptionContext {  
  4.    
  5.     // x1,x2,y1,y2的Throw相關(guān)堆棧信息在創(chuàng)建時一次性生成(不再變化)  
  6.     // 即使用此異常會得到錯誤的堆棧描述信息  
  7.     public static final MyException x1 = new MyException("X1");  
  8.     public static final MyException x2 = new MyException("X2");  
  9.    

c)測試代碼

package demo.bce;

 
 
 
  1. public class MyMain {  
  2.     public static void main(String[] args) {  
  3.        testx();  
  4.     }  
  5.     // ///  
  6.     private static void testx() {  
  7.        try {  
  8.            x11();  
  9.        } catch (Exception e) {  
  10.            e.printStackTrace();  
  11.        }  
  12.        try {  
  13.            x12();  
  14.        } catch (Exception e) {  
  15.            e.printStackTrace();  
  16.        }  
  17.        try {  
  18.            x21();  
  19.        } catch (Exception e) {  
  20.            e.printStackTrace();  
  21.        }  
  22.        try {  
  23.            x22();  
  24.        } catch (Exception e) {  
  25.            e.printStackTrace();  
  26.        }  
  27.     }  
  28.     private static void x11() {  
  29.        throw MyExceptionContext.x1;  
  30.     }  
  31.     private static void x12() {  
  32.        throw MyExceptionContext.x2;  
  33.     }  
  34.     private static void x21() {  
  35.        throw MyExceptionContext.x1;  
  36.     }  
  37.     private static void x22() {  
  38.        throw MyExceptionContext.x2;  
  39.     }  

d)測試結(jié)果

 
 
 
  1. demo.bce.MyException  
  2. at demo.bce.MyExceptionContext.(MyExceptionContext.java:7)  
  3. at demo.bce.MyMain.x11(MyMain.java:36)  
  4. at demo.bce.MyMain.testx(MyMain.java:14)  
  5. at demo.bce.MyMain.main(MyMain.java:7)  
  6. demo.bce.MyException  
  7. at demo.bce.MyExceptionContext.(MyExceptionContext.java:8)  
  8. at demo.bce.MyMain.x11(MyMain.java:36)  
  9. at demo.bce.MyMain.testx(MyMain.java:14)  
  10. at demo.bce.MyMain.main(MyMain.java:7)  
  11. demo.bce.MyException  
  12. at demo.bce.MyExceptionContext.(MyExceptionContext.java:7)  
  13. at demo.bce.MyMain.x11(MyMain.java:36)  
  14. at demo.bce.MyMain.testx(MyMain.java:14)  
  15. at demo.bce.MyMain.main(MyMain.java:7)  
  16. demo.bce.MyException  
  17. at demo.bce.MyExceptionContext.(MyExceptionContext.java:8)  
  18. at demo.bce.MyMain.x11(MyMain.java:36)  
  19. at demo.bce.MyMain.testx(MyMain.java:14)  
  20. at demo.bce.MyMain.main(MyMain.java:7) 

代碼實際上在四個不同的方法中拋出了兩個不同的異常,但拋到四個異常的堆棧信息居然完全一致。

另外,x11和x21雖然拋同一個異常,但x11的異常無stackTrace,x21的異常有stackTrace信息。

2.代碼分析和猜想

在MyExceptionContext***被調(diào)用時才生成常量異常x1和x2。注意x1和x2是同時生成的,且基本上處于相同的方法調(diào)用環(huán)境。故x1和x2的方法調(diào)用堆棧信息基本一致,進而在實際使用時嚴(yán)重誤導(dǎo)異常的拋出分析。

另外,通常情況下,異常是需要設(shè)置cause的。因此,也不應(yīng)該嘗試常量異常(cause每次可能不一樣)。

3.簡單總結(jié)

使用異常時實時new一個出來返回以獲取正確方法調(diào)用堆棧信息。


網(wǎng)站標(biāo)題:Bug分析之異常變量堆棧信息
鏈接URL:http://www.dlmjj.cn/article/djipdci.html