一、異常(Exception)
1. 引入:
什么是異常:
public static void main(String[] args) {
int i=1,j=0;
int sum = i/j;
System.out.println(sum);
}
上面的代碼紫皇,在寫的時候沒有什么問題,但是點擊運行腋寨,就會報出這樣一段結(jié)果:
因為j是為0的聪铺,不能作為除數(shù),點擊運行就出現(xiàn)了算數(shù)異常萄窜。
另一種情況:
這種在我們寫代碼時出現(xiàn)的紅色下劃線计寇,它向我們提示
Unhandled exception: java.io.FileNotFoundException
當前的代碼可能會出現(xiàn)找不到文件的異常
2. 什么是異常:
異常是Exception,是程序的運行期間發(fā)生了不尋常的事情脂倦。
異撤可以通過編寫人員編寫程序解決的。
3. 為什么要處理異常:
如果我們不處理掉異常赖阻,那么程序就不能正常的運行蝶押,因此我們需要處理掉異常。
4. 異常的兩種情況:
由引入我們知道火欧,異常是有兩種情況的棋电,分別是:
編譯時異常(也叫做checked異常):checked異常即是受檢查的異常,在編譯過程中苇侵,如果沒有被catch或者throws關鍵字處理的話赶盔,就沒有辦法通過編譯
-
運行時異常(也叫unchecked異常):是在運行期間發(fā)生的異常。
Runtime Exception 運行時異常榆浓。
unchecked異常即是不受檢查的異常于未,在編譯過程中,我們即使不處理也能正常通過編譯陡鹃,但是在運行時會報出異常烘浦。
RuntimeException
及其子類都統(tǒng)稱為非受檢查異常,常見的有:-
NullPointerException
(空指針異常) -
IllegalArgumentException
(參數(shù)異常萍鲸,比如方法傳入?yún)㈩愋彤惓? -
NumberFormatException
(字符串轉(zhuǎn)換為數(shù)字格式異常闷叉,IllegalArgumentException
的子類) -
ArrayIndexOutOfBoundsException
(數(shù)組越界異常) -
ClassCastException
(類型轉(zhuǎn)換異常) -
ArithmeticException
(算術異常) -
SecurityException
(安全異常,比如權(quán)限不夠) -
UnsupportedOperationException
(不支持的操作異常脊阴,比如重復創(chuàng)建同一用戶) - ......
-
5. 怎么處理異常
異常處理的兩套辦法
- 使用try-catch-finally
- 使用throw-throws
使用try-catch處理異常
try塊中存放可能發(fā)生異常的代碼
catch塊存放處理 異常的代碼
當try塊中發(fā)生異常時握侧,程序立即跳轉(zhuǎn)到catch塊運行,catch塊的作用是捕獲異常嘿期,當異常被捕獲以后品擎,異常就沒有了,所以程序就可以繼續(xù)運行了秽五。
如果try塊中沒有發(fā)生異常孽查,那么程序就不會進入catch塊。
public static void main(String[] args) {
File file = new File("d:/abc.txt");
FileOutputStream fs = null;
try {
fs = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();//將異常捕獲坦喘,則不再繼續(xù)拋出異常
}
}
使用try-catch-finally處理異常
public static void main(String[] args) {
File file = new File("d:/abc.txt");
FileOutputStream fs = null;
try {
fs = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
System.out.println("finally");
}
}
在這段代碼中盲再,無論是否能找到文件西设,finally都能夠運行,
這說明finally表示無論try中是否出現(xiàn)異常答朋,finally都是要執(zhí)行的贷揽。所喲程序執(zhí)行的路徑是
發(fā)生異常時:try-catch-finally
或者
不發(fā)生異常時:try-finally
那我們可以充分利用finally的特點
finally的作用是什么呢?finally的作用是用于回收系統(tǒng)資源梦碗,比如釋放數(shù)據(jù)庫連接禽绪,斷開網(wǎng)絡等。
此外洪规,catch可以多次使用印屁,沒有先后順序。
使用throws和throw處理異常
public static void main(String[] args) throws FileNotFoundException {
File file = new File("d:/abc.txt");
FileOutputStream fs = new FileOutputStream(file);
}
上面代碼將異常通過throws關鍵字向外拋給了虛擬機處理斩例,方法內(nèi)就不出現(xiàn)異常
throw關鍵字可以自己主動拋出一個異常雄人,我們可以借此解決一些日常問題,例如:如果記錄學生成績念赶,成績在0到100之間础钠,超出100或者少于0都不符合我們的要求,這是我們可以用throw處理叉谜。
public static void main(String[] args) {
try {
input();
}catch (RuntimeException e){
e.printStackTrace();
}
}
private static void input()throws RuntimeException {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入成績");
int score = scanner.nextInt();
if (score>100 || score<0){
RuntimeException ex= new RuntimeException("成績必須在0到100之間");
throw ex;
}
System.out.println("成績已保存");
}
Throwable對象的常用方法
-
String getMessage()
: 返回異常發(fā)生時的簡要描述 -
void printStackTrace()
: 在控制臺上打印Throwable
對象封裝的異常信息
private String message;
public ExceptionAndError(String message) {
super(message);
this.message = message;
}
@Override
public String getMessage() {
return this.message;
}//重寫父類getMessage方法
public static void main(String[] args) {
try {
input();
}catch (RuntimeException e){
e.printStackTrace();
System.out.println(e.getMessage());
}
}
在經(jīng)過修改后旗吁,結(jié)果為:
二、 錯誤(Error)
錯誤的引入
public class Test {
public static void main(String[] args) {
method();
}
private static void method() {
method();
}
}
什么是錯誤
錯誤停局,Error很钓,表示無法通過開發(fā)人員編寫程序來解決的錯誤,稱之為錯誤翻具,錯誤相關的類都是以Error結(jié)尾的履怯。
三、Error與Exception的區(qū)別
在 Java 中裆泳,所有的異常都有一個共同的父類 java.lang
包中的 Throwable
類。Throwable
類有兩個重要的子類:
-
Exception :程序本身可以處理的異常柠硕,可以通過
catch
來進行捕獲工禾。Exception
又可以分為 Checked Exception (受檢查異常,必須處理) 和 Unchecked Exception (不受檢查異常蝗柔,可以不處理)闻葵。 -
Error :
Error
屬于程序無法處理的錯誤 ,我們沒辦法通過catch
來進行捕獲癣丧,不建議通過catch
捕獲 槽畔。例如 Java 虛擬機運行錯誤(Virtual MachineError
)、虛擬機內(nèi)存不夠錯誤(OutOfMemoryError
)胁编、類定義錯誤(NoClassDefFoundError
)等 厢钧。這些異常發(fā)生時鳞尔,Java 虛擬機(JVM)一般會選擇線程終止。