# Exception å Error å¨ Java ä¸çåºæ¬çå¿µæ¯ `ç»æä¸ä½³ç代ç ä¸è½è¿è¡`ï¼åç°é误ççæ³æ¶ææ¯å¨ç¼è¯æé´ï¼å ä¸ºä½ ä¸ç¨è¿è¡ç¨åºï¼åªæ¯ååç对 Java åºæ¬ç念çç解就è½åç°é®é¢ã使¯ç¼è¯æå¹¶ä¸è½æ¾åºææçé®é¢ï¼æä¸äº NullPointerException å ClassNotFoundException å¨ç¼è¯ææ¾ä¸å°ï¼è¿äºå¼å¸¸æ¯ RuntimeException è¿è¡æ¶å¼å¸¸ï¼è¿äºå¼å¸¸å¾å¾å¨è¿è¡æ¶æè½è¢«åç°ã æä»¬å Java ç¨åºç»å¸¸ä¼åºç°ä¸¤ç§é®é¢ï¼ä¸ç§æ¯ java.lang.Exception ï¼ä¸ç§æ¯ java.lang.Errorï¼é½ç¨æ¥è¡¨ç¤ºåºç°äºå¼å¸¸æ åµï¼ä¸é¢å°±é对è¿ä¸¤ç§æ¦å¿µè¿è¡çè§£ã ## è®¤è¯ Exception `Exception` ä½äº `java.lang` å ä¸ï¼å®æ¯ä¸ç§é¡¶çº§æ¥å£ï¼ç»§æ¿äº `Throwable` ç±»ï¼Exception ç±»åå ¶åç±»é½æ¯ Throwable çç»ææ¡ä»¶ï¼æ¯ç¨åºåºç°çåçæ åµã å¨è®¤è¯ Exception ä¹åï¼æå¿ è¦å äºè§£ä¸ä¸ä»ä¹æ¯ `Throwable`ã ### ä»ä¹æ¯ Throwable Throwable ç±»æ¯ Java è¯è¨ä¸ææ`é误(errors)`å`å¼å¸¸(exceptions)`çç¶ç±»ãåªæç»§æ¿äº Throwable çç±»æè å ¶åç±»æè½å¤è¢«æåºï¼è¿æä¸ç§æ¹å¼æ¯å¸¦æ Java ä¸ç `@throw` 注解çç±»ä¹å¯ä»¥æåºã å¨[Javaè§è](https://docs.oracle.com/javase/specs/jls/se9/html/jls-11.html#jls-11.1.1)ä¸ï¼å¯¹é忥å¼å¸¸å忥å¼å¸¸çå®ä¹æ¯è¿æ ·çï¼ > The *unchecked exception classes* are the run-time exception classes and the error classes. > The *checked exception classes* are all exception classes other than the unchecked exception classes. That is, the checked exception classes are `Throwable` and all its subclasses other than `RuntimeException` and its subclasses and `Error`and its subclasses. ä¹å°±æ¯è¯´ï¼é¤äº `RuntimeException` åå ¶åç±»ï¼ä»¥å`error`åå ¶åç±»ï¼å ¶å®çææå¼å¸¸é½æ¯ `checkedException`ã é£ä¹ï¼æç §è¿ç§é»è¾å ³ç³»ï¼æä»¬å¯ä»¥å¯¹ Throwable åå ¶åç±»è¿è¡å½ç±»åæ  å¯ä»¥çå°ï¼Throwable ä½äºå¼å¸¸åé误çæé¡¶å±ï¼æä»¬æ¥ç Throwable ç±»ä¸åç°å®çæ¹æ³å屿§æå¾å¤ï¼æä»¬åªè®¨è®ºå ¶ä¸å 个æ¯è¾å¸¸ç¨ç ```java // è¿åæåºå¼å¸¸ç详ç»ä¿¡æ¯ public string getMessage(); public string getLocalizedMessage(); //è¿åå¼å¸¸åçæ¶çç®è¦æè¿° public public String toString()ï¼ // æå°å¼å¸¸ä¿¡æ¯å°æ åè¾åºæµä¸ public void printStackTrace(); public void printStackTrace(PrintStream s); public void printStackTrace(PrintWriter s) // è®°å½æ 帧ççå½åç¶æ public synchronized Throwable fillInStackTrace(); ``` æ¤å¤ï¼å 为 Throwable çç¶ç±»ä¹æ¯ `Object`ï¼æä»¥å¸¸ç¨çæ¹æ³è¿æç»§æ¿å ¶ç¶ç±»ç`getClass()` å `getName()` æ¹æ³ã ### 常è§ç Exception ä¸é¢æä»¬åå° Exception çæ¢è®¨ä¸æ¥ï¼ç°å¨ä½ ç¥éäº Exception çç¶ç±»æ¯ Throwableï¼å¹¶ä¸ Exception æä¸¤ç§å¼å¸¸ï¼ä¸ç§æ¯ `RuntimeException` ï¼ä¸ç§æ¯ `CheckedException`ï¼è¿ä¸¤ç§å¼å¸¸é½åºè¯¥å»`æè·`ã ä¸é¢ååºäºä¸äº Java ä¸å¸¸è§çå¼å¸¸åå ¶åç±»ï¼è¿åé¢è¯å®ä¹å¯è½è®©ä½ 举åºå 个常è§çå¼å¸¸æ åµå¹¶å°å ¶åç±» RuntimeException | åºå· | å¼å¸¸åç§° | å¼å¸¸æè¿° | | ---- | ------------------------------ | ---------------- | | 1 | ArrayIndexOutOfBoundsException | æ°ç»è¶çå¼å¸¸ | | 2 | NullPointerException | 空æéå¼å¸¸ | | 3 | IllegalArgumentException | 鿳忰å¼å¸¸ | | 4 | NegativeArraySizeException | æ°ç»é¿åº¦ä¸ºè´å¼å¸¸ | | 5 | IllegalStateException | éæ³ç¶æå¼å¸¸ | | 6 | ClassCastException | ç±»å转æ¢å¼å¸¸ | UncheckedException | åºå· | å¼å¸¸åç§° | å¼å¸¸æè¿° | | ---- | ---------------------- | -------------------------------- | | 1 | NoSuchFieldException | 表示该类没ææå®åç§°æåºæ¥çå¼å¸¸ | | 2 | NoSuchMethodException | 表示该类没ææå®æ¹æ³æåºæ¥çå¼å¸¸ | | 3 | IllegalAccessException | ä¸å è®¸è®¿é®æä¸ªç±»çå¼å¸¸ | | 4 | ClassNotFoundException | ç±»æ²¡ææ¾å°æåºå¼å¸¸ | ### ä¸ Exception æå ³ç Java å ³é®å é£ä¹ Java 䏿¯å¦ä½å¤çè¿äºå¼å¸¸çå¢ï¼å¨ Java 䏿è¿å ä¸ªå ³é®å **throwsãthrowãtryãfinallyãcatch** ä¸é¢æä»¬å嫿¥æ¢è®¨ä¸ä¸ #### throws å throw å¨ Java ä¸ï¼å¼å¸¸ä¹å°±æ¯ä¸ä¸ªå¯¹è±¡ï¼å®è½å¤è¢«ç¨åºåèªå®ä¹æåºæè åºç¨ç¨åºæåºï¼å¿ é¡»åå©äº `throws` å `throw` è¯å¥æ¥å®ä¹æåºå¼å¸¸ã throws å throw éå¸¸æ¯æå¯¹åºç°çï¼ä¾å¦ ```java static void cacheException() throws Exception{ throw new Exception(); } ``` throw è¯å¥ç¨å¨æ¹æ³ä½å ï¼è¡¨ç¤ºæåºå¼å¸¸ï¼ç±æ¹æ³ä½å çè¯å¥å¤çã throws è¯å¥ç¨å¨æ¹æ³å£°æåé¢ï¼è¡¨ç¤ºåæåºå¼å¸¸ï¼ç±è¯¥æ¹æ³çè°ç¨è æ¥å¤çã throws ä¸»è¦æ¯å£°æè¿ä¸ªæ¹æ³ä¼æåºè¿ç§ç±»åçå¼å¸¸ï¼ä½¿å®çè°ç¨è ç¥éè¦æè·è¿ä¸ªå¼å¸¸ã throw æ¯å ·ä½å夿å¼å¸¸çå¨ä½ï¼æä»¥å®æ¯æåºä¸ä¸ªå¼å¸¸å®ä¾ã #### try ãfinally ãcatch è¿ä¸ä¸ªå ³é®åä¸»è¦æä¸é¢å ç§ç»åæ¹å¼ **try...catch ãtry...finallyãtry...catch...finally**ã try...catch 表示对æä¸æ®µä»£ç å¯è½æåºå¼å¸¸è¿è¡çæè·ï¼å¦ä¸ ```java static void cacheException() throws Exception{ try { System.out.println("1"); }catch (Exception e){ e.printStackTrace(); } } ``` try...finally è¡¨ç¤ºå¯¹ä¸æ®µä»£ç ä¸ç®¡æ§è¡æ åµå¦ä½ï¼é½ä¼èµ° finally ä¸ç代ç ```java static void cacheException() throws Exception{ for (int i = 0; i = 0){ os.write(buf,n,0); } }finally { os.close(); } }finally { is.close(); } } ``` è¿æ ·æè§è¿ä¸ªæ¹æ³å·²ç»åå¾èè¿èµ·æ¥äºã èä¸è¿ç§åæ³ä¹åå¨è¯¸å¤é®é¢ï¼å³ä½¿ try - finally è½å¤æ£ç¡®å ³éèµæºï¼ä½æ¯å®ä¸è½é»æ¢å¼å¸¸çæåºï¼å 为 try å finally åä¸é½å¯è½æå¼å¸¸çåçã æ¯å¦è¯´ä½ æ£å¨è¯»åçæ¶å硬çæåï¼è¿ä¸ªæ¶åä½ å°±æ æ³è¯»åæä»¶åå ³éèµæºäºï¼æ¤æ¶ä¼æåºä¸¤ä¸ªå¼å¸¸ã使¯å¨è¿ç§æ åµä¸ï¼ç¬¬äºä¸ªå¼å¸¸ä¼æ¹æç¬¬ä¸ä¸ªå¼å¸¸ãå¨å¼å¸¸å æ ä¸ä¹æ æ³æ¾å°ç¬¬ä¸ä¸ªå¼å¸¸çè®°å½ï¼æä¹åï¼é¾éåè¿æ ·æ¥ææå¼å¸¸ä¹ï¼ ```java static void tryThrowException(String path) throws Exception { BufferedReader br = new BufferedReader(new FileReader(path)); try { String s = br.readLine(); System.out.println("s = " + s); }catch (Exception e){ e.printStackTrace(); }finally { try { br.close(); }catch (Exception e){ e.printStackTrace(); }finally { br.close(); } } } ``` è¿ç§åæ³ï¼è½ç¶è½è§£å³å¼å¸¸æåºçé®é¢ï¼ä½æ¯åç§ try-cath-finally çåµå¥ä¼è®©ä»£ç åå¾é常èè¿ã Java7 ä¸å¼å ¥äº`try-with-resources` è¯å¥æ¶ï¼ææè¿äºé®é¢é½è½å¾å°è§£å³ãè¦ä½¿ç¨ try-with-resources è¯å¥ï¼é¦å è¦å®ç° `AutoCloseable` æ¥å£ï¼æ¤æ¥å£å å«äºå个è¿åç close æ¹æ³ãJava ç±»åºä¸ä¸æ¹ç±»åºä¸ç许å¤ç±»åæ¥å£ï¼ç°å¨é½å®ç°æè æ©å±äº AutoCloseable æ¥å£ã妿ç¼åäºä¸ä¸ªç±»ï¼å®ä»£è¡¨çæ¯å¿ é¡»å ³éçèµæºï¼é£ä¹è¿ä¸ªç±»åºè¯¥å®ç° AutoCloseable æ¥å£ã java å¼å ¥äº try-with-resources 声æï¼å° try-catch-finally ç®å为 try-catchï¼è¿å ¶å®æ¯ä¸ç§`è¯æ³ç³`ï¼å¨ç¼è¯æ¶ä¼è¿è¡è½¬å为 try-catch-finally è¯å¥ã ä¸é¢æ¯ä½¿ç¨ try-with-resources ç第ä¸ä¸ªèä¾ ```java /** * 使ç¨try-with-resources æ¹å示ä¾ä¸ * @param path * @return * @throws IOException */ static String firstLineOfFileAutoClose(String path) throws IOException { try(BufferedReader br = new BufferedReader(new FileReader(path))){ return br.readLine(); } } ``` ä½¿ç¨ try-with-resources æ¹åç¨åºç第äºä¸ªç¤ºä¾ ```java static void copyAutoClose(String src,String dst) throws IOException{ try(InputStream in = new FileInputStream(src); OutputStream os = new FileOutputStream(dst)){ byte[] buf = new byte[1000]; int n; while ((n = in.read(buf)) >= 0){ os.write(buf,0,n); } } } ``` ä½¿ç¨ try-with-resources ä¸ä» 使代ç åå¾éä¿ææï¼ä¹æ´å®¹æè¯æã以`firstLineOfFileAutoClose`æ¹æ³ä¸ºä¾ï¼å¦æè°ç¨ `readLine() `å `close()` æ¹æ³é½æåºå¼å¸¸ï¼åä¸ä¸ªå¼å¸¸å°±ä¼è¢«ç¦æ¢ï¼ä»¥ä¿ç第ä¸ä¸ªå¼å¸¸ã ### å¼å¸¸å¤ççåå æä»¬å¨æ¥å¸¸å¤çå¼å¸¸ç代ç ä¸ï¼åºè¯¥éµå¾ªä¸ä¸ªåå * ä¸è¦æè·ç±»ä¼¼ `Exception` ä¹ç±»çå¼å¸¸ï¼èåºè¯¥æè·ç±»ä¼¼ç¹å®çå¼å¸¸ï¼æ¯å¦ `InterruptedException`ï¼æ¹ä¾¿ææ¥é®é¢ï¼èä¸ä¹è½å¤è®©å ¶ä»äººæ¥æä½ çä»£ç æ¶ï¼ä¼åå°éªä½ çæ¬¡æ°ã * ä¸è¦çåå¼å¸¸ãè¿æ¯ô²¾å¼å¸¸å¤çä¸è¦ç¹å«æ³¨éô±¸çäºæ ï¼å 为å¾å¯è½ä¼ô±ô± é常é¾ä»¥ô°°ô°±æ£å¸¸ô³¶ô²¾ç»ææ åµã妿æä»¬ä¸æô²¾å¼å¸¸æô²åºæ¥ï¼æè 乿²¡æè¾ô³¹åºå° ô°©ô±¥ô°Loggerô° æ¥å¿ä¸ï¼ç¨åºå¯è½ä¼å¨åé¢ä»¥ä¸å¯æ§çæ¹å¼ç»æã * ä¸è¦å¨å½æ°å¼ç¼ç¨ä¸ä½¿ç¨ `checkedException`ã ## ä»ä¹æ¯ Error Error æ¯ç¨åºæ æ³å¤ççé误ï¼è¡¨ç¤ºè¿è¡åºç¨ç¨åºä¸è¾ä¸¥éé®é¢ã大夿°é误ä¸ä»£ç ç¼åè æ§è¡çæä½æ å ³ï¼è表示代ç è¿è¡æ¶ JVMï¼Java èææºï¼åºç°çé®é¢ãè¿äºé误æ¯ä¸å¯æ£æ¥çï¼å 为å®ä»¬å¨åºç¨ç¨åºçæ§å¶åå¤çè½åä¹ å¤ï¼èä¸ç»å¤§å¤æ°æ¯ç¨åºè¿è¡æ¶ä¸å 许åºç°çç¶åµï¼æ¯å¦ `OutOfMemoryError` å `StackOverflowError`å¼å¸¸çåºç°ä¼æå ç§æ åµï¼è¿ééè¦å ä»ç»ä¸ä¸ Java å 忍¡å JDK1.7ã  å ¶ä¸å æ¬ä¸¤é¨åï¼**ç±ææçº¿ç¨å ±äº«çæ°æ®åºå线ç¨éç¦»çæ°æ®åº**ç»æï¼å¨ä¸é¢ç Java å 忍¡åä¸ï¼**åªæç¨åºè®¡æ°å¨**æ¯ä¸ä¼åç `OutOfMemoryError` æ åµçåºåï¼ç¨åºè®¡æ°å¨æ§å¶çè®¡ç®æºæä»¤ç忝ã循ç¯ã跳转ãå¼å¸¸å¤çåçº¿ç¨æ¢å¤ï¼å¹¶ä¸ç¨åºè®¡æ°å¨æ¯æ¯ä¸ªçº¿ç¨ç§æçã >ä»ä¹æ¯çº¿ç¨ç§æï¼è¡¨ç¤ºçå°±æ¯åæ¡çº¿ç¨ä¹é´äºä¸å½±åï¼ç¬ç«åå¨çå ååºåã 妿åºç¨ç¨åºæ§è¡çæ¯ Java æ¹æ³ï¼é£ä¹è¿ä¸ªè®¡æ°å¨è®°å½çå°±æ¯`èææºåèç `æä»¤çå°åï¼å¦ææ£å¨æ§è¡çæ¯ `Native` æ¹æ³ï¼è¿ä¸ªè®¡æ°å¨å¼å为`空(Undefined)`ã é¤äºç¨åºè®¡æ°å¨å¤ï¼å ¶ä»åºåï¼`æ¹æ³åº(Method Area)`ã`èææºæ (VM Stack)`ã`æ¬å°æ¹æ³æ (Native Method Stack)` å `å (Heap)` 齿¯å¯è½åç OutOfMemoryError çåºåã * èææºæ ï¼å¦æçº¿ç¨è¯·æ±çæ æ·±åº¦å¤§äºèææºæ æå è®¸çæ·±åº¦ï¼å°ä¼åºç° `StackOverflowError` å¼å¸¸ï¼å¦æèææºå¨ææ©å±æ æ³ç³è¯·å°è¶³å¤çå åï¼å°åºç° `OutOfMemoryError`ã * æ¬å°æ¹æ³æ åèææºæ 䏿 · * å ï¼Java å å¯ä»¥å¤äºç©çä¸ä¸è¿ç»ï¼é»è¾ä¸è¿ç»ï¼å°±åæä»¬çç£ç空é´ä¸æ ·ï¼å¦æå 䏿²¡æå å宿å®ä¾åé ï¼å¹¶ä¸å æ æ³æ©å±æ¶ï¼å°ä¼æåº OutOfMemoryErrorã * æ¹æ³åºï¼æ¹æ³åºæ æ³æ»¡è¶³å ååé éæ±æ¶ï¼å°æåº OutOfMemoryError å¼å¸¸ã ## ä¸éç»å ¸çé¢è¯é¢ ä¸éé常ç»å ¸çé¢è¯é¢ï¼**NoClassDefFoundError å ClassNotFoundException æä»ä¹åºå«**ï¼ å¨ç±»çå è½½è¿ç¨ä¸ï¼ JVM æè ClassLoader æ æ³æ¾å°å¯¹åºçç±»æ¶ï¼é½å¯è½ä¼å¼èµ·è¿ä¸¤ç§å¼å¸¸/é误ï¼ç±äºä¸åç ClassLoader ä¼ä»ä¸åçå°æ¹å è½½ç±»ï¼ææ¶æ¯é误ç CLASSPATH 类路å¾å¯¼è´çè¿ç±»éè¯¯ï¼ææ¶æ¯æä¸ªåºç jar å 缺失å¼åè¿ç±»é误ãNoClassDefFoundError 表示è¿ä¸ªç±»å¨ç¼è¯æ¶æåå¨ï¼ä½æ¯å¨è¿è¡æ¶å´æ¾ä¸å°æ¤ç±»ï¼ææ¶éæåå§ååä¹ä¼å¯¼è´ NoClassDefFoundError é误ã >ClassLoader æ¯ç±»è·¯å¾è£ è½½å¨ï¼å¨Java ä¸ï¼ç±»è·¯å¾è£ è½½å¨ä¸å ±æä¸ç§ä¸¤ç±» > >ä¸ç§æ¯èææºèªå¸¦ç ClassLoaderï¼å为ä¸ç§ > >* `å¯å¨ç±»å è½½å¨(Bootstrap)` ï¼è´è´£å è½½ $JAVAHOME/jre/lib/rt.jar >* `æ©å±ç±»å è½½å¨(Extension)`ï¼è´è´£å è½½ $JAVAHOME/jre/lib/ext/*.jar >* `åºç¨ç¨åºç±»å è½½å¨(AppClassLoader)`ï¼å è½½å½ååºç¨ç classpath çææç±» > >第äºç§æ¯ç¨æ·èªå®ä¹ç±»å è½½å¨ > >* Java.lang.ClassLoader çåç±»ï¼ç¨æ·å¯ä»¥å®å¶ç±»çå è½½æ¹å¼ã  å¦ä¸æ¹é¢ï¼ClassNotFoundException ä¸ç¼è¯æ¶ææ å ³ï¼å½ä½ å°è¯å¨è¿è¡æ¶ä½¿ç¨åå°å 载类æ¶ï¼ClassNotFoundException å°±ä¼åºç°ã ç®èè¨ä¹ï¼ClassNotFoundException å NoClassDefFoundError 齿¯ç± CLASSPATH ä¸ç¼ºå°ç±»å¼èµ·çï¼é常æ¯ç±äºç¼ºå° JAR æä»¶èå¼èµ·çï¼ä½æ¯å¦æ JVM 认为åºç¨è¿è¡æ¶æ¾ä¸å°ç¸åºçå¼ç¨ï¼å°±ä¼æåº NoClassDefFoundError é误ï¼å½ä½ å¨ä»£ç 䏿¾ç¤ºçå 载类æ¯å¦ `Class.forName()` è°ç¨æ¶å´æ²¡ææ¾å°ç¸åºçç±»ï¼å°±ä¼æåº `java.lang.ClassNotFoundException`ã * NoClassDefFoundError æ¯ JVM å¼èµ·çéè¯¯ï¼æ¯ uncheckedï¼æªç»æ£æ¥çãå æ¤ä¸ä¼ä½¿ç¨ try-catch æè finally è¯å¥åï¼å¦å¤ï¼ClassNotFoundException æ¯åæ£å¼å¸¸ï¼å æ¤éè¦ try-catch è¯å¥åæè try-finally è¯å¥åå å´ï¼å¦åä¼å¯¼è´ç¼è¯é误ã * è°ç¨ **Class.forName()ãClassLoader.findClass() å ClassLoader.loadClass()** çæ¹æ³æ¶å¯è½ä¼å¼èµ· `java.lang.ClassNotFoundException`ï¼å¦å¾æç¤º  * NoClassDefFoundError æ¯é¾æ¥é误ï¼åçå¨é¾æ¥é¶æ®µï¼å½è§£æå¼ç¨æ¾ä¸å°å¯¹åºçç±»ï¼å°±ä¼è§¦åï¼è ClassNotFoundException æ¯åçå¨è¿è¡æ¶çå¼å¸¸ã æç« åèï¼ https://www.java67.com/2012/12/noclassdeffounderror-vs-classnotfoundexception-java.html ãæå®¢æ¶é´-Javaæ ¸å¿ææ¯ 36 讲ã ãæ·±å ¥çè§£ Java èææºã第äºç ãEffective Java 第ä¸çã https://www.cnblogs.com/xiohao/p/3547443.html https://blog.csdn.net/qq_29229567/article/details/80773970 https://blog.csdn.net/riemann_/article/details/87522352 ãJavaç¼ç¨ææ³ã https://www.cnblogs.com/xz816111/p/8466048.html https://docs.oracle.com/javase/specs/jls/se9/html/jls-11.html#jls-11.1.1 jdk 1.8 æºç 注é 