內容
詳細請看:http://www.lxweimin.com/p/7cf0611738b1
1.異常簡介
2.常見異常
3.trycatch
4.throws
5.自定義異常
一.異常簡介
當程序出現異常情況時,如果我們沒有處理,那么程序會直接終止運行,也就是崩潰。但是我們不知道是哪里出了問題。所以為了解決這個問題,就要使用“異常”。
注意:錯誤是和異常是有區別的,錯誤不能被處理,只能退出JVM,而異常是可以處理的。兩者都繼承Throwable。
異常繼承結構圖(蘊含與錯誤關系)
二.常見異常
常見異常有
空指針異常NullPointerException
類型轉換異常ClassCastException
數組越界IndexOutOfBoundsException
等等
三.trycatch
可以使用try catch捕獲異常
1.注意點
①當try代碼塊里面出現異常之后,后面的代碼不會執行。
所以②不要讓try包裹太多的內容,雖然try可以嵌套,但是最好不要多層嵌套。這樣代碼結構會混亂,可讀性會變差。如果非要嵌套,那最多弄兩層就夠了。
其實③catch可以寫多個,所以沒必要搞嵌套
即try{
}catch(){
}catch(){
}finally{
}
2.finally
這里finally是釋放資源。不管有沒有異常,finally里面的東西一定會執行。
注意:①一般需要釋放文件、網絡和數據庫資源的時候需要用finally,就是哪些代碼必須要執行,就把這些代碼放在finally里面。
②Java只會自動釋放在堆或者棧上的資源,不會釋放外部資源。比如打開文件之后,出現了異常,那么文件可能不會關閉,這里Java不會自動關閉文件的。
③finally里面也可以進行trycatch,比如文件可能也關閉不了,就在finally里面trycatch一下。
3.使用格式
try {
}catch() {
}catch() {
}finally {
try {
}catch() {
}
}
4.注意點(續)
④當有多個catch的時候,按照子類到父類的順序進行捕獲,如果父類的異常捕獲在前,那么就會攔截子類的catch。
⑤但是很多情況我們不太會關心具體是捕獲什么異常,只是關心異常的處理,就可以使用所有異常的父類Exeption來捕獲即可。打印出來的內容其實也是具體的異常。這樣會方便很多,而且代碼也會更加簡潔。
四.throws
除了使用trycatch,也可以使用throws拋出異常,后面可以是拋出具體的異常,也可以直接拋出Exception。
1.何時用
某個方法完成某個功能,當執行時可能出現異常,這種異常需要調用者自己決定該如何處理,也就是說程序員自己不知道,不確定該怎么處理,就使用throws拋出異常
2.使用示例
import java.io.*;
import java.util.*;
class Test{
public void show() throws IOException{
FileReader fr = null;
}
}
public class 測試程序 {
public static void main(String[] args) {
Test t = new Test();
try {
t.show();
}catch(IOException e) {
e.printStackTrace();
}
}
}
五.自定義異常
1.使用
1.如果是編譯時異常:直接繼承Exception
2.如果是運行時異常:直接繼承RuntimeException
當然也都可以籠統繼承Exception
2.注意點
自定義異常里面一般提供兩個構造方法,其中一個是無參的,另外一個傳字符串,并且在構造函數里面執行super(傳入的字符串)。
(這個字符串就是出現異常的時候提示的內容)
3.使用示例
import java.io.*;
import java.util.*;
class Test{
//登錄方法
//不允許首字母是數字1
public void login(String name,String pwd) throws LoginException {
if(name.startsWith("1")) {
//自己定義一個異常
LoginException e = new LoginException("用戶名不能以1開頭");
throw e;
//或者直接
//throw new LoginException("用戶名不能以1開頭");
}
}
}
class LoginException extends Exception{
public LoginException() {
}
public LoginException(String s) {//字符串是提示的內容
super(s);
}
}
public class 測試程序 {
public static void main(String[] args) {
Test t = new Test();
try {
t.login("1Jack", "123");
}catch(LoginException e) {
e.printStackTrace();
}
}
}
總結
收獲頗豐!尤其是對throws和自定義異常的理解更透徹了!