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

嗶嗶one
TA貢獻1854條經驗 獲得超8個贊
你
throw new Sneeze();
為何不能被?
} catch (Sneeze s) { System.out.println("Caught Sneeze"); return; }
添加回答
舉報
0/150
提交
取消