自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Bug分析之異常變量堆棧信息

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

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

下面演示一段有問題的代碼并進(jìn)行分析

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)建時(shí)一次性生成(不再變化)  
  6.     // 即使用此異常會(huì)得到錯(cuò)誤的堆棧描述信息  
  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.<clinit>(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.<clinit>(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.<clinit>(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.<clinit>(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) 

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

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

2.代碼分析和猜想

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

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

3.簡單總結(jié)

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

原文鏈接:http://jekiy.iteye.com/blog/1318670

【編輯推薦】

  1. 解讀Java環(huán)境變量配置
  2. Java精確截取字符串
  3. Java I/O系統(tǒng)基礎(chǔ)知識
  4. Java 遠(yuǎn)程文件對接
  5. Java字符編碼根本原理
責(zé)任編輯:林師授 來源: jekiy的博客
相關(guān)推薦

2020-07-08 07:50:50

OOM虛擬機(jī)Java

2011-04-01 10:55:29

OSPFDebug

2023-11-15 17:23:30

測試軟件開發(fā)

2021-06-07 09:37:05

異常Bug排查

2021-01-28 09:34:08

解密密鑰取證分析

2023-03-28 07:08:09

RocketMQ消費(fèi)者堆棧

2014-11-10 09:42:59

JVM線程堆棧

2023-09-17 23:23:14

Java異常堆棧

2021-07-04 22:29:12

MySQL死鎖云日志

2021-02-25 08:40:19

Java異常分類異常防護(hù)

2021-03-18 10:01:06

Java編譯異常運(yùn)行異常

2022-07-27 11:45:43

iOS蘋果系統(tǒng)

2011-06-14 16:05:31

BUG流程

2020-10-05 21:33:15

隱私數(shù)據(jù)匿名數(shù)據(jù)安全

2023-03-01 09:07:44

前端監(jiān)控異常

2018-04-19 08:40:37

OracleJOB異常中斷

2021-06-05 23:41:47

NET異常 HttpClient

2021-04-13 12:55:06

SpringMVC解析器接口

2011-05-26 10:05:48

MongoDB

2009-11-09 09:55:24

WCF學(xué)習(xí)筆記
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號