異常:java在運行時期出現的不正常情況。
1.概述:按照面向對象的思想對問題進行描述和封裝,將問題變成對象,裏面包含着問題的名稱,信息以及位置等。
2.常見的問題:一種可處理的;向上抽取到一個父類中:Exception(異常)
一種是通常不處理的,向上抽取到一個父類中Error.通常都是由jvm或者系統拋出的嚴重問題,解決方法是修改代碼。
3.無論是錯誤還是異常,都有名稱、信息、位置等共性內容,向上抽取到父類中Throwable(可拋).
4.異常的體系:Throwable的子類有 Exception 和 Error.
5.問題的發生是可以拋出的,所以他們的父類是Throwavle,而且這個體系和其它體系都有不同,是因爲這個體系中的類以及其對象都具備着可拋性。
6.可拋性:可以被throw或者throws關鍵字所操作。
class Demo
{
void show(int index)
{
int[] arr = new int[3];
if(index>=arr.length)
throw new ArrayIndexOutOfBoundsException("數組角標越界啦!!越界角標是:"+index);
System.out.println(arr[index]);
System.out.println("haha");
}
}
class ExceptionDemo
{
public static void main(String[] args)
{
Demo d = new Demo();
d.show(3);
System.out.println("over");
}
}
7.異常分兩種:一種是編譯時需要被檢測的異常,Exception及其子類,可以進行針對性的處理;
一種是編譯時不被檢測的異常,Exception中一個特殊子類體系RuntimeException,通常不編寫處理方式,直接讓程序停止,讓調用者進行代碼的修正。意味着:我們在自定義異常時,可以繼承Exception,也可以繼承RuntimeException.
8.針對性處理:可以通過java提供的指定的處理代碼完成。
try
{
需要被檢測的代碼;
}
catch (異常類 變量名)
{
異常的處理代碼;
}
finally
{
一定執行的代碼;
}
9.異常處理的基本原則:1.在catch異常時,對方功能聲明的是什麼異常,catch裏就處理什麼異常,這樣處理才具有針對性。
2.如果對方函數聲明多個異常,則必須由對個catch分別對這些異常進行處理。
3.如果出現多catch,父類catch則必須放在最下面。
10.異常拋出的基本原則:1.功能中用throw關鍵字拋出了異常,如果沒有被catch處理,就必須用throws關鍵字在函數上進行聲明。
注意:RuntimeException及其子類除外,也就說,功能中throw拋出的是RuntimeException和其子類對象,函數上可以不用throws進行聲明。
函數上用throws進行聲明的原因:是爲了讓調用者在調用該功能時,進行定義預先的處理方式。
11.拋出和try處理:功能內部可以進行處理嗎?可以就catch;不可以就必須throws。
12.自定義異常:當在函數內部出現了throw拋出異常對象,那麼就必須要給對應的處理動作,一般在函數上用throws關鍵字標示可能出現異常,好處是可以讓調用者預先進行問題的處理。
getMessage:信息;toString:名稱+信息;printStackTrace:名稱+信息+位置;
class FuShuException extends Exception
{
FuShuException()
{
super();
}
FuShuException(String message)
{
super(message);
}
}
class Demo
{
int div(int a,int b)throws FuShuException//在函數上用throws關鍵字標示有可能有問題。
//這樣的好處在於可以讓調用者預先進行問題的處理。
{
if(b==0)
throw new ArithmeticException("哎呀!除數爲零了。完了!");//拋出的是java已有的異常的對象。
if(b<0)
throw new FuShuException("除數不可以是負數:錯誤的負數值時:"+b);//拋出了自定義異常對象。
return a/b;
}
}
class ExceptionDemo2
{
public static void main(String[] args)throws FuShuException//主函數調用了有異常的方法,
//處理方式是聲明繼續拋出。拋給了jvm
{
Demo d = new Demo();
int num = d.div(4,-1);
System.out.println("num="+num);
System.out.println("Hello World!");
}
}
13.throw和throws的區別:throw用在函數內,用於拋出異常對象,後面跟的都是異常的對象。
throws用在函數上,用於聲明異常,後面跟的都是異常類,而且可以跟多個,用逗號隔開;
14.小細節:throw在函數中的出現,可以用於結束函數的運行,相當於return。
函數內發生異常函數上不聲明,是爲了讓調用者對代碼進行修正,而這種異常都是RuntimeException及其子類。
注意:沒catch,沒處理。
15.異常講解常見實例
除數爲零,和除數不能爲負數。
class FuShuException extends Exception
{
FuShuException()
{
super();
}
FuShuException(String message)
{
super(message);
}
}
class Test
{
int div(int a,int b)throws FuShuException//在函數上用throws關鍵字標示有可能有問題;這樣的好處在於可以讓調用者預先進行問題的處理。
{
if(b==0)
throw new ArithmeticException("哎呀!除數爲零了。完了!");//拋出的是java已有的異常的對象。
if(b<0)
throw new FuShuException("除數不可以是負數:錯誤的負數值時:"+b);//拋出了自定義異常對象。
return a/b;
}
}
class ExceptionT
{
public static void main(String[] args)//throws FuShuException//主函數調用了有異常的方法,處理方式是聲明繼續拋出。拋給了jvm
{
Demo d = new Demo();
try
{
int num = d.div(4,-1);
System.out.println("num="+num);
}
catch (FuShuException e)
{
System.out.println("message:"+e.getMessage());//信息
System.out.println("tostring:"+e.toString());//名稱+信息
e.printStackTrace();//名稱+信息+位置。其實jvm的默認處理方式,就是調用了這個方法。
System.out.println("異常被我抓住啦!!");
}
System.out.println("Hello World!");
}
}
16.finally 語句:這個代碼塊中定義的是一定會執行的代碼。
1.不能被catch塊中的return語句結束,可是能被System.exit(0)結束。
2.主要用於關閉資源,只要使用了資源,就一定要將其關閉。
3.應用:數據庫的連接,連接——操作——關閉。可能在操作過程中出現異常,沒關閉數據庫,就需要把關閉數據庫放在finally語句裏面。
17.組合方式:
try{}catch (){}、try{}catch(){}、try{}finally{}(這種用於關閉資源)
18.異常在覆蓋時的細節
1.子類在覆蓋父類方法時,如果父類方法拋出了異常,子類覆蓋的方法只能拋出父類方法異常或其子類。
2.父類方法如果拋出多個異常,子類在覆蓋父類方法時,只能拋出父類異常的子集。
3.如果父類中的方法沒有拋出異常,子類覆蓋父類時,絕對不能聲明異常。只能進行 try{} catch 處理;如果處理不了,那就應該讓程序
停掉,讓調用者知道。即在catch中拋出RuntimeException異常或其子類對象,這時不用拋,RuntimeException不用在函數上聲明。