標籤

二元樹 (1) 字串常數池 (1) 投資 (3) 每月損益 (37) 例外處理 (1) 泛型 (2) 股票 (15) 指標 (5) 英文 (8) 基本資料型別 (1) 期貨 (1) 程式交易 (10) 量化投資 (5) 亂亂寫 (3) 概念 (3) 資料結構 (3) 演算法 (3) 數學 (3) 轉型 (1) AMA (1) ArrayList (1) assert (1) BeautifulSoup (1) C/C++ (8) casting (1) ClassCastException (1) classpath (1) Collection (4) Comparable (1) comparTo() (1) constructor (1) database (3) Debian (1) Dropbox (2) EA (2) enum (1) equals() (2) exception (3) extends (1) ffmpeg (1) final (1) Git (1) HashMap (1) HashSet (1) hasNext() (1) HTS (3) instanceof (1) IS-A (1) Iterator (1) JAVA (43) length (1) Linux (31) List (1) Mac (6) Map (1) ML (2) MT4 (6) MySQL (2) next() (1) NullPointerException (1) Number (1) Numpy (2) OpenCart (1) OpenCV (3) OSX (1) overloading (1) overriding (3) pandas (2) PHP (8) PriorityQueue (1) Python (11) Queue (1) random() (1) reverse() (1) Samba (1) SCJP (21) sqrt() (1) synchronized (1) talib (1) ufw (1) uTorrent (1) var-args (2) VHF (1) vim (2) Yhoo知識+ (4)

2012年11月10日 星期六

覆寫函式的可控式例外

覆寫規則其中一條是:不能宣告範圍更大或新的exception。
2012.11.18補充:除非新的exception為RuntimeException或其子類別。

例1:

class A{
    A length(){return this;}
}
class Test1 extends A{
        Test1 length()throws NullPointerException{ return this;}

        public static void main(String[] args){
                System.out.println(new Test1().length());
        }
}
------------
Test1@57f0dc

說明:
Test1 length()throws NullPointerException{ return this;}:劃線為合法,因為可宣告回傳型別為父函式的子型別;又因為父函式未宣告exception,所以表示父函式可能丟出任何exception,而NullPointerException為exception的子類別,符合覆寫規則。
證明:
class A{A length()throws NullPointerException{return this;}}
class Test1 extends A{
        Test1 length()throws Exception {return this;}
        public static void main(String[] args){
                System.out.println(new Test1().length());
        }
}
---------------
Test1.java:4: length() in Test1 cannot override length() in A; overridden method does not throw java.lang.Exception
Test1 length()throws Exception {return this;}
              ^

例2:
class MyException extends Exception{}
class A{A length(){return this;}}
class Test1 extends A{
        Test1 length()throws MyException {return this;}
        public static void main(String[] args){
                System.out.println(new Test1().length());
        }
}
----------------
Test1.java:4: length() in Test1 cannot override length() in A; overridden method does not throw MyException
Test1 length()throws MyException {return this;}
              ^
不能丟新的exception。不過明明MyException就有繼承Exception啊,為何還是無法通過編譯呢?

2012.11.18更新
上面觀念錯了,在此重新𨤳淸:
一個覆寫的函式的確不能丟出範圍比父函式要大的例外。
只有一種可以:RuntimeException(包含其子類別)可以由子函式丟出。因為RuntimeException為非可控式例外(unchecked exception)不用去處理;基本上無視它就是了。
所以上面例1的Test1 length()throws NullPointerException{ return this;},NullPointerException為RuntimeException的子類別,所以子函式雖然有宣告,但編譯器無視它,當做沒這回事,當然就能順利編譯。但例2的Test1 length()throws MyException {return this;},MyException為Exception的子類別,非屬於RuntimeException,所以編譯無法通過。

沒有留言:

張貼留言