/*
因爲 在項目中會出現特有的問題
而這些問題並未被java所描述並封裝
所以對這些特有的問題可以按照java的對問題封裝的思想
將特有的問題,進行自定義的異常封裝
自定義異常
需求:
在本程序中對於除數是負數-1,也是視爲是錯誤的,是無法進行運算的
那麼就需要對這個問題進行自定義的描述。
當在函數內部出現throw拋出異常對象,那麼就必須給要對應的處理動作
要麼在內部try catch 處理
要麼在函數上聲明讓調用這處理
一般情況在 函數內出現異常,函數上需要聲明.
發現打印的結果中只有異常名稱,卻沒有異常的信息
因爲自定義的異常並未定義信息
如何定義異常信息呢。
因爲父類中已經把異常信息操作都完成了,
所以子類只要在構造時,將一類信息傳遞給父類通過super語句
那麼就可以直接功過getMessage方法獲取自定義的異常。
自定義異常: 必須是自定義類繼承Exception
繼承Exception原因:
異常體系有一個特點,因爲異常類和異常對象都需要被拋出,
他們都具備可拋性,這個可拋性是Throwable這個體系中獨有特點
只有這個體系中的類和對象纔可以被throws 和throw 操作。
throws和throw區別
throws使用在函數上
throw 使用在函數內
throws 後面跟的是異常類,可以跟多個,用逗號隔開 就是:()這個位置{}
throw 後面跟的是異常對象。
【【異常中的特殊子類異常】】
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]
}
*/
------------------------------------------------------------------------------------------------------------------------------
【【異常應用】】
package _9Day;
/*
* 異常應用
*
* 畢老師用電腦上課。
* 老師、電腦、倆類,上課是行爲.
*
* 上課中會出現各種問題,產生異常。
* 比如電腦、藍屏、冒煙兒 :接下來進行描述,封裝成對象 (自定義異常
* 藍屏後只許重啓即可
* 而 當冒煙發生後,會出現進度無法繼續。
* 就出現了講師的問題,課時計劃無法完成。 (又多了個類
*
* 【通過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("大家做練習吧");
}
}
public class D_Exp_Test1 {
public static void main(String[] args) {
Teacher t=new Teacher("畢老師");
try{
t.prelect();
}
catch(NoPlanException e){
System.out.println(e.toString());
System.out.println("換老師,換電腦,放假");
}
}
}
---------------
黑馬官網: http://edu.csdn.net/heima