異常知識梳理
---------------------------------------------------------------------------------------------------------------------------------------------
1、throws 聲明異常------throw 捕獲異常
2、聲明異常時,建議聲明更爲具體的異常,這樣處理可以更具體
3、在函數內部出現throw拋出異常對象,那麼就必須給要對應的處理動作
4、自定義異常: 必須是自定義類繼承Exception
2、聲明異常時,建議聲明更爲具體的異常,這樣處理可以更具體
3、在函數內部出現throw拋出異常對象,那麼就必須給要對應的處理動作
4、自定義異常: 必須是自定義類繼承Exception
繼承Exception原因:1、異常體系有一個特點,因爲異常類和異常對象都需要被拋出,他們都具備可拋性,這個可拋性是Throwable這個體系中獨有特點2、只有這個體系中的類和對象纔可以被throws 和throw 操作。
5、Exception 中有一個特殊的子類異常RuntimeException 運行時異常
如果在函數內容拋出該異常,函數上可以不用聲明,編譯一樣通過如果在函數上聲明該異常,調用者可以不用進行處理,編譯一樣通過
6、自定義的異常時:如果該異常的發生,無法在繼承進行運算
就讓自定義類異常繼承RuntimeException
7、異常,分兩種
1、編譯時,被檢測出的異常 (方法後需要拋出異常。)2、編譯時,不被檢測出的異常(運行時的異常就是RuntimeException異常)
-----------------------------------------------------------
【1】
1
Throwable
【1】
1
Throwable
Error 嚴重性問題Exception非嚴重性,針對性進行處理。都是以父類名作爲後綴。
問題也是現實生活中的一個具體事物,也可以通過Java的類的形式進行描述
並封裝成對象,其實就是Java對不正常情況進行描述後的對象體現。
2、異常的處理
Java提供了特有的語句進行處理
try{
Java提供了特有的語句進行處理
try{
需要被檢測的代碼
}
catch(異常類 變量){
catch(異常類 變量){
處理異常的代碼(也就是處理方式)
}
finally{
finally{
一定會執行的語句。
}
3、對捕獲到的異常對象進行常見的操作
3、對捕獲到的異常對象進行常見的操作
String getMessage(): 獲取異常信息
4、聲明異常\ 捕獲異常
throws 聲明異常throw 捕獲異常
5、對多異常的處理
1、聲明異常時,建議聲明更爲具體的異常,這樣處理可以更具體2、對聲明幾個異常,對應幾個 catch 塊,如果多個catch塊中的異常出現了繼承關係,父類異常catch塊放在最下面。
建立在進行catch處理時,catch 塊中一定要具體的處理方法。
而不是 e.printStackTrace() 或 簡單的輸出語句
【2】
【自定義異常】
因爲 在項目中會出現特有的問題
而這些問題並未被java所描述並封裝
所以對這些特有的問題可以按照java的對問題封裝的思想
將特有的問題,進行自定義的一場封裝
自定義異常
需求:
在本程序中對於除數是負數-1,也是視爲是錯誤的,是無法進行運算的
那麼就需要對這個問題進行自定義的描述。
當在函數內部出現throw拋出異常對象,那麼就必須給要對應的處理動作
要麼在內部try catch 處理
要麼在函數上聲明讓調用這處理
一般情況在 函數內出現異常,函數上需要聲明.
發現打印的結果中只有異常名稱,卻沒有異常的信息
因爲自定義的異常並未定義信息
如何定義異常信息呢。
因爲父類中已經把異常信息操作都完成了,
所以子類只要在構造時,將一類信息傳遞給父類通過super語句
那麼就可以直接功過getMessage方法獲取自定義的異常。
自定義異常: 必須是自定義類繼承Exception
繼承Exception原因:
異常體系有一個特點,因爲異常類和異常對象都需要被拋出,
他們都具備可拋性,這個可拋性是Throwable這個體系中獨有特點
只有這個體系中的類和對象纔可以被throws 和throw 操作。
【3】
throws和throw區別
throws使用在函數上
throw 使用在函數內
throws 後面跟的是異常類,可以跟多個,用逗號隔開 就是:()這個位置{}
throw 後面跟的是異常對象。
【4】
【【異常中的特殊子類異常】】
Exception 中有一個特殊的子類異常RuntimeException 運行時異常
如果在函數內容拋出該異常,函數上可以不用聲明,編譯一樣通過
如果在函數上聲明該異常,調用者可以不用進行處理,編譯一樣通過
之所以在函數上聲明,是因爲不需要調用者處理
當該異常發生,希望程序停止,因爲在運行時,出現了無法繼續運算的情況,
希望停止程序後,由程序員對代碼進行修正。
【m】
自定義的異常時:如果該異常的發生,無法在繼承進行運算
就讓自定義類異常繼承RuntimeException
對於異常,分兩種
【自定義異常】
因爲 在項目中會出現特有的問題
而這些問題並未被java所描述並封裝
所以對這些特有的問題可以按照java的對問題封裝的思想
將特有的問題,進行自定義的一場封裝
自定義異常
需求:
在本程序中對於除數是負數-1,也是視爲是錯誤的,是無法進行運算的
那麼就需要對這個問題進行自定義的描述。
當在函數內部出現throw拋出異常對象,那麼就必須給要對應的處理動作
要麼在內部try catch 處理
要麼在函數上聲明讓調用這處理
一般情況在 函數內出現異常,函數上需要聲明.
發現打印的結果中只有異常名稱,卻沒有異常的信息
因爲自定義的異常並未定義信息
如何定義異常信息呢。
因爲父類中已經把異常信息操作都完成了,
所以子類只要在構造時,將一類信息傳遞給父類通過super語句
那麼就可以直接功過getMessage方法獲取自定義的異常。
自定義異常: 必須是自定義類繼承Exception
繼承Exception原因:
異常體系有一個特點,因爲異常類和異常對象都需要被拋出,
他們都具備可拋性,這個可拋性是Throwable這個體系中獨有特點
只有這個體系中的類和對象纔可以被throws 和throw 操作。
【3】
throws和throw區別
throws使用在函數上
throw 使用在函數內
throws 後面跟的是異常類,可以跟多個,用逗號隔開 就是:()這個位置{}
throw 後面跟的是異常對象。
【4】
【【異常中的特殊子類異常】】
Exception 中有一個特殊的子類異常RuntimeException 運行時異常
如果在函數內容拋出該異常,函數上可以不用聲明,編譯一樣通過
如果在函數上聲明該異常,調用者可以不用進行處理,編譯一樣通過
之所以在函數上聲明,是因爲不需要調用者處理
當該異常發生,希望程序停止,因爲在運行時,出現了無法繼續運算的情況,
希望停止程序後,由程序員對代碼進行修正。
【m】
自定義的異常時:如果該異常的發生,無法在繼承進行運算
就讓自定義類異常繼承RuntimeException
對於異常,分兩種
1、編譯時,被檢測出的異常 (方法後需要拋出異常。)2、編譯時,不被檢測出的異常(運行時的異常就是RuntimeException異常)(方法中拋出了非Run異常或其子類,上面沒有標識,就視爲有安全隱患的。)
【【【【結論:如果自定義異常,要麼繼承Exception要麼繼承RuntimeException】】】】
class FuException extends Exception{
private int value;
//這個也可以,裏面有默認的。
FuException(){
super();
}
FuException(String msg,int value){
super(msg);
this.value=value;
}
public int getValue(){
return value;
}
/*
}【m】
class FuException extends RuntimeException{
private int value;
//這個也可以,裏面有默認的。
FuException(){
super();
}
FuException(String msg,int value){
super(msg);
this.value=value;
}
public int getValue(){
return value;
}
class Demo_3{
int div(int a,int b) //這裏不在需要聲明
{
if(b <0){
throw new FuException("出現負數",b);//手動通過throw 關鍵字拋出一個自定義的異常
}
if(b =0){
throw new FuException("出現0",b);//手動通過throw 關鍵字拋出一個自定義的異常
}
return a/b;
}
}
*/
}
class Demo_3{
int div(int a,int b) throws FuException{
if(b <0){
//System.out.println("出現異常:");
throw new FuException("出現負數",b);//手動通過throw 關鍵字拋出一個自定義的異常
}
return a/b;
}
}
public class D_Exception {
public static void main(String[] args){
Demo_3 d=new Demo_3();
try{
int x=d.div(4,2);
System.out.println("x="+x);
}
catch(FuException e){
//System.out.println(e.toString());
//System.out.println("出現負數");
System.out.println("負數:"+e.getValue());
}
//catch(Exception e){
//}
System.out.println("over");
}
}
/*
class Person_1{
public void checkName(String name){
//if(name.equals("lisi")){//一旦[a]處傳入NULL,那麼就回報NullPointerException異常
程序就停掉了。如何修正:
if("lisi".equalse(name)){//if(name!==null&&name.equals("lisi")){
System.out.println("YES");
}else {
System.out.println("NO");
}
}
}
main(){
Person_1 p=new Person_1();
p.checkName(null);//[a]
}
*/
【5】畢老師用電腦上課。
老師、電腦、倆類,上課是行爲.
上課中會出現各種問題,產生異常。
比如電腦、藍屏、冒煙兒 :接下來進行描述,封裝成對象 (自定義異常
藍屏後只許重啓即可
而 當冒煙發生後,會出現進度無法繼續。
就出現了講師的問題,課時計劃無法完成。 (又多了個類
【通過state來手動設置異常】
//藍屏異常
class LPException extends Exception{
//藍屏是可以處理的,大多時候重啓即可,那麼這裏就需要電腦的重啓功能了
private Comeputer comp;
LPException(String message){
super(message);
}
public void goReset(){
comp.reset();
}
}
//冒煙異常
class MYException extends Exception{ //RuntimeException{//冒煙了無法處理了
MYException(String message){
super(message);
}
}
//人爲異常
class NoPlanException extends Exception{
NoPlanException(String message){
super(message);
}
}
class Comeputer {
private int state =3;//2表示藍屏 3冒煙
public void run()throws LPException,MYException{//拋出可能有的異常
if(state==2){
throw new LPException("電腦藍屏了。");//拋出異常
}
if(state==3){
throw new MYException("電腦冒煙兒了");//拋出異常
}
System.out.println("comepter run");
}
public void reset(){
state=1;
System.out.println("comepter reset");
}
}
class Teacher{
private String name;
private Comeputer cmpt;
Teacher(String name){//初始化老師名字、電腦
this.name=name;
cmpt=new Comeputer();
}
public void prelect()throws NoPlanException{//MYException{//講課方法
try{
cmpt.run();
}
catch(LPException e){
cmpt.reset();
}
catch(MYException e){//接收到冒煙異常然後拋出冒煙後無法繼續講課的問題,這個問題就好處理
test();
throw new NoPlanException("課時無法繼續"+e.getMessage());
//這裏的邏輯是,冒煙是不可處理異常,發生該異常後,處理就是換電腦,換老師等延續課時的方案。
//test(); throw 後面是不能更語句的。他和return一樣是結束語句。
}
//System.out.println("開始講課");
}
public void test(){
System.out.println("大家做練習吧");
}
}
電腦冒煙兒了,就相當於 error , 屬於嚴重的問題,而 出現了這種情況,卻是可以有其他方式處理的,
可以借用電腦,可以替換個老師,可以自習,可以放假。
【6】
【異常練習】
有一個圓形和長方形
都可以獲取面積,對於面積如果出現非法數值,視爲是貨獲取面積出現的問題
問題通過異常來表示
先有對這個程序進行基本設計
正常代碼,和問題處理代碼分隔開。
寫代碼的過程中,遇到問題,用代碼封裝起來,問題也是一個對象。
*/
【6】
【異常練習】
有一個圓形和長方形
都可以獲取面積,對於面積如果出現非法數值,視爲是貨獲取面積出現的問題
問題通過異常來表示
先有對這個程序進行基本設計
正常代碼,和問題處理代碼分隔開。
寫代碼的過程中,遇到問題,用代碼封裝起來,問題也是一個對象。
*/
//面積接口
interface Shape{
double getArea();
}
//負數或零異常
class FLException extends RuntimeException { //Exception{
FLException(String msg){
super(msg);
}//
}
//長方形
class Rec implements Shape{
private int len,wid;
Rec(int len,int wid) {//throws FLException //使用Runtaime異常這裏就不用在寫,main方法中也不用在寫。
if(len<=0 ||wid<=0)
throw new FLException("數值錯誤!");
this.len=len;
this.wid=wid;
}
public double getArea(){
System.out.println("Area:"+len*wid);
return len*wid;
}
}
//圓形
class Yuan implements Shape{
private double r;
private static final double PI=2.14; //設爲全局常量
Yuan(double r){
if(r<=0)
throw new FLException("非法!");
this.r=r;
}
public double getArea(){
System.out.println("Area:"+r*r*PI);
return r*r*PI;
}
}
public class D_Exp_Test1 {
public static void main(String[] args) {
Rec r=new Rec(23,4);
r.getArea();
Yuan yu=new Yuan(-3);
yu.getArea();
}
}
---------------------------------------------------------------------------------------------------------------------------------------------
----------
android培訓、 java培訓、期待與您交流!----------
----------------------------------------------