異常就是在程序的運(yùn)行過(guò)程中出現(xiàn)的不正?,F(xiàn)象導(dǎo)致了程序中斷,之前遇到的異常有哪些?
1.空指針異常: NullPointerException
2.類(lèi)型轉(zhuǎn)換異常:ClassCastException
3.算術(shù)異常: ArithmeticException
在java中, 把一些不正?,F(xiàn)象進(jìn)行了抽象, 形成了一些異常類(lèi)。
在Throwable類(lèi)的getMessage()/printStackTrace()這兩個(gè)方法,所有的異常都有。
編譯時(shí)異常,也稱受檢異常是指在編譯前必須進(jìn)行預(yù)處理, 并不是說(shuō)這個(gè)異常在編譯階段發(fā)生,所有的異常都是在運(yùn)行階段才可能發(fā)生. 就像樓道中必須有滅火器與消防栓, 如果沒(méi)有這些設(shè)備, 就沒(méi)有安全證, 沒(méi)有這個(gè)安全證,企業(yè)就不能生產(chǎn). 企業(yè)必須有火災(zāi)的預(yù)處理措施, 火災(zāi)現(xiàn)在并沒(méi)有發(fā)生。
編譯階段進(jìn)行語(yǔ)法檢查, Java的語(yǔ)法有很多條, 其中一語(yǔ)語(yǔ)法是: 對(duì)于受檢異常必須進(jìn)行預(yù)處理。
package com.wkcto.chapter02.demo01;
/**
* 運(yùn)行時(shí)異常都是RuntimeException類(lèi)的子類(lèi)
* 不需要進(jìn)行預(yù)處理,
* 通過(guò)規(guī)范的代碼進(jìn)行規(guī)避
* @author 蛙課網(wǎng)
*
*/
public class Test01 {
public static void main(String[] args) {
int x = 10;
int y = 2;
// divide(x, y); //10/2=5
// divide(10, 0); //這一行產(chǎn)生了異常,導(dǎo)致了程序中斷, 程序不再繼續(xù)向下執(zhí)行
divide22(x, y);
divide22(10, 0);
System.out.println("main....end...");
}
//定義方法,計(jì)算兩個(gè)整數(shù)的商, 沒(méi)有判斷除數(shù)為0的情況
public static void divide( int num1, int num2) {
int result = num1/num2;
System.out.println( num1 + "/" + num2 + "=" + result);
}
//定義方法,計(jì)算兩個(gè)整數(shù)的商, 通過(guò)判斷除數(shù)為0避免出現(xiàn)算術(shù)異常
public static void divide22( int num1, int num2) {
if ( num2 == 0 ) {
System.out.println("除數(shù)不能為0");
return ; //結(jié)束方法的執(zhí)行
}
int result = num1/num2;
System.out.println( num1 + "/" + num2 + "=" + result);
}
}
package com.wkcto.chapter02.demo01;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* 演示編譯時(shí)異常
* 受檢異常, 受控異常
* @author 蛙課網(wǎng)
*
*/
public class Test02 {
public static void main(String[] args) {
//讀取d:/abc.txt文件中的內(nèi)容, 使用了FileInputStream類(lèi)
FileInputStream fis = new FileInputStream("d:/abc.txt");
//SUN在定義FileInputStream構(gòu)造方法時(shí), 通過(guò) throws關(guān)鍵字聲明了FileNotFoundException異常,
//這個(gè)異常就是受檢異常, 即在定義方法時(shí), 通過(guò)throws聲明的異常
//受檢異常在編譯前必須進(jìn)行預(yù)處理, 否則編譯語(yǔ)法報(bào)錯(cuò)
}
}