java物件導向(異常)
1. 異常:就是程式在執行時出現不正常情況
異常由來:問題也是現實生活中一個具體的事物,也可以透過java的類形式進行描述。並封裝成物件。其實就是 java對不正常情況進行描述後的物件體現。
對於嚴重的,java透過error類進行描述
對於error一般不編寫針對性的程式碼對其進行處理
對於非嚴重的,java透過exception類進行描述。
對於exception可以使用針對性的處理方式進行處理
無論Error或者Exception都具有一些共性內容。
比如:不正常情況的資訊,引發原因等。
異常體系:
Throwable
|--Error
|--Exception
|--RuntimeException
2,異常的處理
java 提供了特有的語句進行處理。
try
{
需要被檢測的程式碼;
}
catch(異常類 變數)
{
處理異常的程式碼;(處理方式)
}
finally
{
一定會執行的語句;通常用於關閉資源。
}
有三個結合格式:
1) try
{
}
catch ()
{
}
2) try
{
}
finally
{
}
3) try
{
}
catch ()
{
}
finally
{
}
注意:
finally中定義的通常是 關閉資原始碼。因為資源必須釋放。
finally只有一種情況不會執行。當執行到System.exit(0);fianlly不會執行。
3,對捕獲到的異常物件進行常見方法操作。
String getMessage():獲取異常資訊。
當函式內容有throw丟擲異常物件,並未進行try處理。必須要在函式上宣告,都在編譯失敗。
注意,RuntimeException除外。也就說,函式內如果丟擲的RuntimeExcpetion異常,函式上可以不用宣告。
如果函式宣告瞭異常,呼叫者需要進行處理。處理方法可以throws可以try。
class Demo
{
int div(int a,int b)throws Exception //在功能上透過throws的關鍵字宣告瞭該功能有可能會出現問題
{
return a/b;
}
}
public class ExceptionDemo {
public static void main(String[] args)//throws Exception
{
Demo d=new Demo();
//int x=d.div(4, 1);
//System.out.println("x="+x);
try
{
int x=d.div(4, 1);
System.out.println("x="+x);
}
catch(Exception e)
{
System.out.println("除零啦");
System.out.println(e.getMessage()); // /by zero
System.out.println(e.toString());//異常名稱:異常資訊
e.printStackTrace();//異常名稱,異常資訊,異常出現的位置。
//其實jvm預設的異常處理機制,就是在呼叫printStackTrace方法。
//列印異常的堆疊的跟蹤資訊。
}
}
}
4.對多異常的處理。
1,宣告異常時,建議宣告更為具體的異常。這樣處理的可以更具體。
2,對方宣告幾個異常,就對應有幾個catch塊。不要定義多餘的catch塊。
如果多個catch塊中的異常出現繼承關係,父類異常catch塊放在最下面。
建立在進行catch處理時,catch中一定要定義具體處理方式。
不要簡單定義一句 e.printStackTrace(),
也不要簡單的就書寫一條輸出語句。
class Demo
{
int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException //在功能上透過throws的關鍵字宣告瞭該功能有可能會出現問題
{
int[] arr=new int [a];
System.out.println(arr[4]);
return a/b;
}
}
public class ExceptionDemo {
public static void main(String[] args) //throws Exception
{
Demo d=new Demo();
//int x=d.div(4, 1);
//System.out.println("x="+x);
try
{
int x=d.div(2, 0);
System.out.println("x="+x);
}
catch(ArithmeticException e)
{
System.out.println("除零啦");
e.printStackTrace();//異常名稱,異常資訊,異常出現的位置。
//其實jvm預設的異常處理機制,就是在呼叫printStackTrace方法。
//列印異常的堆疊的跟蹤資訊。
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("越界啦");
e.printStackTrace();//異常名稱,異常資訊,異常出現的位置。
//其實jvm預設的異常處理機制,就是在呼叫printStackTrace方法。
//列印異常的堆疊的跟蹤資訊。
}
//System.out.println("over");
}
}
執行結果:
越界啦
java.lang.ArrayIndexOutOfBoundsException: 4
at Demo.div(ExceptionDemo.java:6)
at ExceptionDemo.main(ExceptionDemo.java:23)
5.自定義異常。
因為專案中會出現特有的問題,
而這些問題並未被java所描述並封裝物件。
所以對於這些特有的問題可以按照java的對問題封裝的思想。
將特有的問題。進行自定義的異常封裝。
需求:在本程式中,對於除數是-1,也視為是錯誤的是無法進行運算的。
那麼就需要對這個問題進行自定義的描述。
當在函式內部出現了throw丟擲異常物件,那麼就必須要給對應的處理動作。
要麼在內部try catch處理。
要麼在函式上宣告讓呼叫者處理。
一般情況在,函式內出現異常,函式上需要宣告。
發現列印的結果中只有異常的名稱,卻沒有異常的資訊。
因為自定義的異常並未定義資訊。
如何定義異常資訊呢?
因為父類中已經把異常資訊的操作都完成了。
所以子類只要在構造時,將異常資訊傳遞給父類透過super語句。
那麼就可以直接透過getMessage方法獲取自定義的異常資訊。
自定義異常:
必須是自定義類繼承Exception。
繼承Exception原因:
異常體系有一個特點:因為異常類和異常物件都被丟擲。
他們都具備可拋性。這個可拋性是Throwable這個體系中獨有特點。
只有這個體系中的類和物件才可以被throws和throw操作。
6. throws和throw的區別
throws使用在函式上。
throw使用在函式內。
throws後面跟的異常類。可以跟多個。用逗號隔開。
throw後跟的是異常物件。
class FuShuException extends Exception
{
private int value;
FuShuException()
{
super();
}
FuShuException(String msg,int value)
{
super(msg);
this.value=value;
}
public int getValue()
{
return value;
}
}
class Demo
{
int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException,FuShuException //在功能上透過throws的關鍵字宣告瞭該功能有可能會出現問題
{
if(b<0)
//throw new FuShuException() ;
throw new FuShuException("出現了除數是負數的情況 ----/by fushu",b) ;//手動透過throw關鍵字丟擲一個自定義異常
return a/b;
}
}
public class ExceptionDemo {
public static void main(String[] args) //throws Exception
{
Demo d=new Demo();
//int x=d.div(4, 1);
//System.out.println("x="+x);
try
{
int x=d.div(3, -1);
System.out.println("x="+x);
}
catch(ArithmeticException e)
{
System.out.println("除零啦");
e.printStackTrace();//異常名稱,異常資訊,異常出現的位置。
//其實jvm預設的異常處理機制,就是在呼叫printStackTrace方法。
//列印異常的堆疊的跟蹤資訊。
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("越界啦");
e.printStackTrace();//異常名稱,異常資訊,異常出現的位置。
//其實jvm預設的異常處理機制,就是在呼叫printStackTrace方法。
//列印異常的堆疊的跟蹤資訊。
}
catch(FuShuException e)
{
//System.out.println("除數是負數");
e.printStackTrace();//異常名稱,異常資訊,異常出現的位置。
//其實jvm預設的異常處理機制,就是在呼叫printStackTrace方法。
//列印異常的堆疊的跟蹤資訊。
System.out.println("除數是負數:"+e.getValue());
}
//System.out.println("over");
}
}
7.RuntimeException
Exceptoin中有一個特殊的子類異常RuntimeException 執行時異常。
如果在函式內丟擲該異常,函式上可以不用宣告,編譯一樣透過。
如果在函式上宣告瞭該異常。呼叫者可以不用進行處理。編譯一樣透過;
之所以不用在函式宣告,是因為不需要讓呼叫者處理。
當該異常發生,希望程式停止。因為在執行時,出現了無法繼續運算的情況,希望停止程式後,
對程式碼進行修正。
自定義異常時:如果該異常的發生,無法在繼續進行運算,
就讓自定義異常繼承RuntimeException。
對於異常分兩種:
1,編譯時被檢測的異常。
2,編譯時不被檢測的異常(執行時異常。RuntimeException以及其子類)
class FuShuException extends RuntimeException
{
FuShuException(String msg)
{
super(msg);
}
}
class Demo
{
int div(int a,int b)//throws Exception//throws ArithmeticException
{
if(b<0)
throw new FuShuException("出現了除數為負數了");
//if(b==0)
//throw new ArithmeticException("被零除啦");
return a/b;
}
}
public class ExceptionDemo {
public static void main(String[] args) //throws Exception
{
Demo d=new Demo();
int x=d.div(4, -1);
System.out.println("x="+x);
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27026361/viewspace-1189467/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JAVA物件導向基礎--異常Java物件
- java物件導向複習總結(異常)Java物件
- 物件導向 約束、自定義異常、加密物件加密
- 2.1.3 Python物件導向之異常處理Python物件
- Java — 物件導向Java物件
- Java物件導向Java物件
- [Java物件導向]Java物件
- JAVA物件導向基礎--物件導向介紹Java物件
- Java:Java的物件導向Java物件
- java的物件導向Java物件
- Java物件導向(一)Java物件
- java物件導向(中)Java物件
- java物件導向(上)Java物件
- Java 物件導向概述Java物件
- java物件導向(2)Java物件
- java物件導向(1)Java物件
- java物件導向(3)Java物件
- java物件導向(4)Java物件
- java物件導向(5)Java物件
- Java物件導向概述Java物件
- JAVA物件導向思想Java物件
- Java物件導向——類與物件Java物件
- JAVA(一)JAVA基礎/物件導向基礎/高階物件導向Java物件
- 物件導向-物件導向思想物件
- JAVA物件導向之多型Java物件多型
- JAVA物件導向基礎Java物件
- 二、Java之物件導向Java物件
- Java物件導向--多型Java物件多型
- java物件導向繼承Java物件繼承
- java物件導向(包package)Java物件Package
- 【Java 基礎】——物件導向Java物件
- JAVA物件導向--抽象類Java物件抽象
- Java基礎 --- 物件導向Java物件
- [Java物件導向]finalJava物件
- [Java物件導向]static方法Java物件
- Java常見知識點彙總(③)——物件導向基礎Java物件
- Java物件導向詳解-上Java物件
- java基礎二:物件導向Java物件