亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

一道面試題,關于java的異常處理的

一道面試題,關于java的異常處理的

鳳凰求蠱 2018-07-31 17:00:01
class Annoyance extends Exception {}class Sneeze extends Annoyance {}class Human {    public static void main(String[] args)         throws Exception {        try {            try {                throw new Sneeze();            }             catch ( Annoyance a ) {                System.out.println("Caught Annoyance");                throw a;            }        }         catch ( Sneeze s ) {            System.out.println("Caught Sneeze");            return ;        }        finally {            System.out.println("Hello World!");        }    }}下面公布輸出結果以及我的問題,如果沒遇到這個問題的可以先想想輸出結果是什么請輸入代碼輸出Caught AnnoyanceCaught SneezeHello World!我的思路是這樣的,首先拋出 throw new Sneeze();被它的父類Annoyance的catch塊接受到,打印Caught Annoyance接著拋出父類Annoyance對象,該對象不能被子類接受到吧,所以應該是捕捉不到,但是程序運行的結果還是捕捉到了并打印Caught Sneeze。這是為什么呢?
查看完整描述

2 回答

?
阿晨1998

TA貢獻2037條經驗 獲得超6個贊

你對Java的類這個概念了解還不夠,Sneeze是Annoyance的子類,意味著Sneeze一定是Annoyance,所以參數類型為Annoyance的時候,傳遞進去一個Sneeze實例并沒有什么問題,這個實例在被拋出的時候當然會被捕獲。有一段類似的代碼你可以看看。

class Animal  {

    void talk(){

        System.out.print("I'm Animal");

    }

}

class Human extends Animal {

    void talk(){

        System.out.print("I'm Human");

    }

}


class Main{

    public static void main(String[] args) throws Exception {

        bark(new Human());

    }


    static void bark(Animal a){

        a.talk();

    }

}

在上面的代碼中,為什么最后會打印I'm Human而不是I'm Animal

查看完整回答
反對 回復 2018-08-06
?
嗶嗶one

TA貢獻1854條經驗 獲得超8個贊

throw new Sneeze();

為何不能被?

} catch (Sneeze s) {
  System.out.println("Caught Sneeze");  
  return;
}


查看完整回答
反對 回復 2018-08-06
  • 2 回答
  • 0 關注
  • 1444 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號