NO.1 簡單異常演示
public static void main (String[] args) {
//Java異常學(xué)習(xí)--Exception
/**
* * A:JVM默認(rèn)是如何處理異常的
* main函數(shù)收到這個問題時,有兩種處理方式:
* a:自己將該問題處理,然后繼續(xù)運行
* b:自己沒有針對的處理方式,只有交給調(diào)用main的jvm來處理
* jvm有一個默認(rèn)的異常處理機(jī)制,就將該異常進(jìn)行處理.
* 并將該異常的名稱,異常的信息.異常出現(xiàn)的位置打印在了控制臺上,同時將程序停止運行
* B:案例演示
* JVM默認(rèn)如何處理異常
*/
Demo3 d = new Demo3();
// int x = d.div(10,2);
//這樣正常調(diào)用是沒問題的
int x = d.div(10,0);
//我們讓除數(shù)為0.就會拋出異常
System.out.println(x);//java.lang.ArithmeticException
//以后我們看錯誤從后往前看蚕涤,先來到出錯的每一行,最后看運行時異常
}
}
class Demo3 {
public int div(int a, int b) {
return a / b;
}
}
NO.2 異常處理的方式
#第一種
public static void main (String[] args) {
/**
* * A:異常處理的兩種方式
* a:try?catch?finally
* try catch
* try catch finally
* try finally
* b:throws
* B:try...catch處理異常的基本格式
* try?catch?finally
* C:案例演示
* try...catch的方式處理1個異常
try:用來檢測異常的
catch:用來捕獲異常的
finally:釋放資源
世界上最真情的相依就是你在try我在catch,無論你發(fā)神馬脾氣,我都靜靜接受,默默處理
當(dāng)通過trycatch將問題處理了,程序會繼續(xù)執(zhí)行
*/
Demo2 d = new Demo2();
try{
int x = d.div(10, 0);
System.out.println(x);
}catch(ArithmeticException a) { //ArithmeticException a = new ArithmeticException();
System.out.println("出錯了,除數(shù)為零了");
}
//我們經(jīng)過主動異常處理铣猩,就可以繼續(xù)執(zhí)行程序了
System.out.println("1111111111111111");
}
}
class Demo2 {
/*
* 除法運算
*/
public int div(int a,int b) { //a = 10,b = 0
return a / b; // 10 / 0 被除數(shù)是10,除數(shù)是0當(dāng)除數(shù)是0的時候違背了算數(shù)運算法則,拋出異常
//new ArithmeticException("/ by zero");
}
}
#第二種
/**
* * A:案例演示
* try...catch的方式處理多個異常
* JDK7以后處理多個異常的方式及注意事項
*
* 安卓,客戶端開發(fā),如何處理異常?try{}catch(Exception e){}
* ee,服務(wù)端開發(fā),一般都是底層開發(fā),從底層向上拋
*
* try后面如果跟多個catch,那么小的異常放前面,大的異常放后面,根據(jù)多態(tài)的原理,如果大的放前面,就會將所有的子類對象接收
* 后面的catch就沒有意義了
*/
public static void main(String[] args) {
//demo1();
int a = 10;
int b = 0;
int[] arr = {11,22,33,44,55};
//JDK7如何處理多個異常
try {
System.out.println(a / b);
System.out.println(arr[10]);
} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
System.out.println("出錯了");
}
}
public static void demo1() {
int a = 10;
int b = 0;
int[] arr = {11,22,33,44,55};
try {
System.out.println(a / b);
System.out.println(arr[10]);
arr = null;
System.out.println(arr[0]);
} catch (ArithmeticException e) {
System.out.println("除數(shù)不能為零");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("索引越界了");
} catch (Exception e) { //Exception e = new NullPointerException();
System.out.println("出錯了");
}
System.out.println("over");
}
}
NO.3 編譯時異常和運行時異常的區(qū)別
//Java中的異常分為編譯期和運行期異常
//寫個編譯期異常--編譯時異骋就可以理解為未雨綢繆異常
//編譯時異常就是必須對其進(jìn)行處理,不然編譯是不通過的
//這個FileInputStream就是讀取文件的达皿,現(xiàn)在在自動編譯的時候就報錯了天吓。
//因為我們這個文件路徑可能是錯誤的,就讀取不到峦椰,所以我們做下處理
//運行時異常:就是程序員的代碼錯誤龄寞,需要程序員回來修改代碼
try {
FileInputStream stre = new FileInputStream("tmac.xxx");
}catch (Exception e){
}
NO.4 Throwable的幾個常見方法
/**
* * A:Throwable的幾個常見方法
* a:getMessage()
* 獲取異常信息,返回字符串汤功。
* b:toString()
* 獲取異常類名和異常信息物邑,返回字符串。
* c:printStackTrace()
* 獲取異常類名和異常信息,以及異常出現(xiàn)在程序中的位置色解。返回值void茂嗓。
* B:案例演示
* Throwable的幾個常見方法的基本使用
*/
public static void main(String[] args) {
try {
System.out.println(1/0);
} catch (Exception e) { //Exception e = new ArithmeticException("/ by zero");
//System.out.println(e.getMessage()); //獲取異常信息
//System.out.println(e); //調(diào)用toString方法,打印異常類名和異常信息
e.printStackTrace(); //jvm默認(rèn)就用這種方式處理異常
}
}
}
NO.5 throws拋出異常的處理方式
/**
* * A:throws的方式處理異常
* 定義功能方法時,需要把出現(xiàn)的問題暴露出來讓調(diào)用者去處理科阎。
* 那么就通過throws在方法上標(biāo)識在抛。
* B:案例演示
* 舉例分別演示編譯時異常和運行時異常的拋出
* 編譯時異常的拋出必須對其進(jìn)行處理
* 運行時異常的拋出可以處理也可以不處理
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Person p = new Person();
p.setAge(-17);
System.out.println(p.getAge());
}
}
class Person {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) throws AgeOutOfBoundsException {
if(age >0 && age <= 150) {
this.age = age;
}else {
//Exception e = new Exception("年齡非法");
//throw e;
throw new AgeOutOfBoundsException("年齡非法");
}
}
}
NO.6 finaly關(guān)鍵字的作用和特點
/**
* * A:finally的特點
* 被finally控制的語句體一定會執(zhí)行
* 特殊情況:在執(zhí)行到finally之前jvm退出了(比如System.exit(0))
* B:finally的作用
* 用于釋放資源,在IO流操作和數(shù)據(jù)庫操作中會見到
* C:案例演示
* finally關(guān)鍵字的特點及作用
*return語句相當(dāng)于是方法的最后一口氣,那么在他將死之前會看一看有沒有finally幫其完成遺愿,如果有就將finally執(zhí)行
*后在徹底返回
*/
public static void main(String[] args) {
try {
System.out.println(10/0);
} catch (Exception e) {
System.out.println("除數(shù)為零了");
System.exit(0); //退出jvm虛擬機(jī)
return;
} finally {
System.out.println("看看我執(zhí)行了嗎");
}
}
NO.7 簡單面試題
//面試題
//final,finally和finalize的區(qū)別
//final:可以修飾類萧恕,不能被繼承刚梭,修飾方法,不能被重寫票唆,修飾變量朴读,只能賦值一次
//finally:是try語句中的一個語句體,不能被單獨使用走趋,用來釋放資源
//finalize:是一個方法衅金,當(dāng)垃圾回收器確定存在對該對象的過多引用時,由該對象的垃圾回收器調(diào)用此方法
//第二題:
//問:如果catch里面有return語句簿煌,finally的代碼還會執(zhí)行嗎氮唯?如果會,請問是在return前還是return后
//答:是在return先建立返回路徑姨伟,然后執(zhí)行finally語句惩琉,最后返回
//看這個例子
Test test = new Test();
int num = test.method();
System.out.println(num);
}
}
class Test {
public int method(){
int x = 10;
try{
x = 20;
System.out.println(1/0);
return x;
}catch (Exception e){
x = 30;
return x;
}finally {
x = 40;
System.out.println("finally執(zhí)行了嘛");
//千萬不要在finally里面寫返回語句,因為finally的作用是釋放資源夺荒,是肯定執(zhí)行的瞒渠。如果在這里面寫了返回語句,那么try和catch的結(jié)果都會被改變
}
}
}