以前寫代碼,很少用到異常,后來發現這種習慣是錯的。異常也是一種信息,並不是錯誤。
1:先寫個簡單的類:
package com.exception.demo; public class Main { public static void main(String[] args) { Main main = new Main(); } public void methodTry() { } public void methodThrow() { } }
初始環境就是這么簡答。
2:下面給方法methodTry加上方法主體:
public static void main(String[] args) { Main main = new Main(); main.methodTry(); } public void methodTry() { int a=10; int b=0; int c=a/b; }
剛開始學代碼的時候都會寫這個方法,會拋出一個異常:
控制台很清楚的告訴我們,被除數不能為0.但是如果我們想自己獲取這個異常,然后做些操作呢?比如說 如果這個方法體有問題,我就做一個輸出。
public void methodTry() { try { int a=10; int b=0; int c=a/b; System.out.println(c); } catch (Exception e) { System.out.println("這個方法體有問題:"+e.getMessage()); } }
這個時候就用到了try-catch,手動的捕獲這個異常,然后進行我們需要的操作。畢竟異常分很多種,並不是所有的異常都是我們不需要的。比如說對用戶登錄來說,登錄成功 登錄失敗兩種結果,登錄失敗又分為重復登錄,賬號密碼不匹配等。我們可以把這些失敗全都寫成Exception。當成功的時候就直接返回,失敗的時候拋出異常,這個可比我們寫好多返回值簡單多了。
接着說try-catch
我們手動的捕獲了這個異常。上面的代碼告訴我們,當try-catch塊中有異常時,異常后面的代碼是不會執行的。try-catch還有什么好處?回滾。
3:throw
public static void main(String[] args) { Main main = new Main(); main.methodThrow(); } public void methodThrow() { throw new Exception("這里有異常"); }
其實當我簡單的拋出個異常的時候,throw new Exception()這里會報錯,現在看一個報錯信息:
顯示讓我們選擇是throws 還是try-catch。
我們寫好的throw是什么意思呢? 其實跟a/0是一個意思,都是拋出一個異常,只不過一個是jdk已經定義好的異常,被除數不能為0.一個是我們手動拋出的異常。
先用try-catch試試看
public void methodThrow() { try { throw new Exception("這里有異常"); } catch (Exception e) { System.out.println("MethodThrow:"+e.getMessage()); } }
重點在於手動拋出異常后,我們要在catch中進行處理,在catch中寫我們的部門邏輯代碼。
4:throws
剛才我們選擇的是try-catch,現在選擇throws
public static void main(String[] args) throws Exception { Main main = new Main(); main.methodThrow(); } public void methodThrow() throws Exception { throw new Exception("這里有異常"); }
方法methodThrow throws Exception之后,他的父類就面臨着兩種情況,要么try-catch 要么throws這個異常。這種情況跟methodThrow中手動拋出異常遇到的問題是一樣的。
看來可以這么理解:
throw是手動拋出異常,跟 被除數不能為0 數組下標越界等異常一樣,都是異常。
try-catch是在catch中手動捕獲異常,然后進行一些操作。比如說輸出異常信息,打印錯誤日志等。
throws是往上級拋出異常,我的方法methodThrow有異常,但是在這個方法中我不進行處理了,讓上級進行處理吧。然后就跑到main函數那去了。對main函數來說,可以throws讓系統進行處理,也可以自己處理這個異常啊。main.methodThrow()和a/0 、throw new Execption()沒什么區別,都是有異常。
其實可以整體的寫:
public static void main(String[] args){ Main main = new Main(); try { main.methodThrow(); } catch (Exception e) { System.out.println(e.getMessage()); } } public void methodThrow() throws Exception { throw new Exception("這里有異常"); }
方法中的異常,到main函數中再進行處理。