簡體   English   中英

如果拋出RuntimeException,它是否可以作為異常捕獲?

[英]If RuntimeException is thrown, can it be caught as an Exception?

如果我有一個拋出RuntimException子類的try塊,后續的catch塊是否可以將其作為Exception捕獲? 特別:

public class MyAppException extends RuntimeException {
    // ....
}

// In some other part of the code:
try {
    // Executing this results with doSomething() throwing a MyAppException.
    int x = doSomething();
} catch(Exception exc) {
    // Does the thrown MyAppException get caught here?
}

我的想法是肯定的 ,因為RuntimeException擴展了Exception 但是我有一些不符合這種方式的生產代碼。 很明顯,如果答案是否定的,那就是我的答案; 否則我需要深入了解為什么我的代碼壞了。 提前致謝!

RuntimeException派生自Exception ,因此它將被捕獲。

說完這個, 不要這樣做 應該防止運行時異常,而不是捕獲。

是。 它將捕獲RuntimeException但是如果在catch塊中出現任何Exception ,則必須再次捕獲。

我建議你進行本地部署並調試代碼。

如果catch(Exception)沒有捕獲您的RuntimeException,那么您的應用程序的行為方式與您的想法不同。

try {
    throw new RuntimeException();
} catch (Exception e) {
    System.out.println("Caught "+e);
}

版畫

Caught java.lang.RuntimeException

是。 可以捕獲RuntimeExceptions。 可以捕獲Throwable的所有子類。

是的,你可以捕獲RuntimeException ...但我認為它不是一個好方法,如果你抓住它你應該正確管理它。 否則結果就在你手中。 最好的方法是將它留給JVM。 JVM將處理它。

是的,你的想法是正確的,我認為知道回答“只是編寫代碼”的最好方法,讓代碼告訴你答案。 你可以看到以下簡單的示例代碼:

    package own;

public class MyExceptionTest {

    public void testRuntimeException (){
        throw new MyException();
    }

    public static void main(String[] args) {
        try{
            new MyExceptionTest().testRuntimeException();
        }catch(Exception e){
            System.out.println(e.getClass().getName());
        }
    }
}    

class MyException extends RuntimeException{
    public MyException(){
        super();
    }
}

我是IT的項目經理,我和我的開發人員一遍又一遍地爭論,他們根本不在乎。 瀏覽網絡,甚至大多數人都主張捕捉和投擲RuntimException ......每當我看到它,經歷了10年的經驗后,我會對這次難以接受的事情感到非常憤怒....

規則1:

如果沒有捕獲RuntimeException,永遠不要在Program中拋出runtimeexception。

規則2:

只捕獲一個Runtimeexception,以便真正導入與您的軟件無關的東西 :例如發送郵件到操作緊急轉移,記錄異常,重啟服務器....

原因是在良好的軟件中,日志文件中沒有堆棧跟蹤。 當開始代碼感到不舒服時,請執行以下操作:

創建新類DevelopmentException擴展異常。 然后goahead並編寫代碼並最初捕獲異常。 然后你重新拋出它作為你自己的發展特征。 在捕獲它的方法中,您記錄它。

現在:每天為你個人的DevelopmentException grep。 如果你發現這意味着還有工作要做。 進入你的代碼,看看Exception來自哪里,並事先捕獲它。

理想情況下,您再也不會在程序的這一部分中看到DevelopmentException。 重復,直到您的軟件中有0個Stacktraces,並且您已經完善了異常處理。

拋出和捕獲運行時異常的最大問題是編譯忽略它。 所以這意味着當你的一個同事寫一個預訂界面並在缺少一個值時拋出RuntimeException(是的,ppl真的這樣做)......編譯器不會告訴你可能存在運行時異常。 現在,當你沒有抓住它時,你的程序可能只是關閉而沒有任何記錄。

為什么叫做RuntimeException? 許多人在程序運行時錯誤地將其視為錯誤,但它實際上意味着“異常具有極大的破壞性,以至於Java Runtime Environment需要停止”。 換句話說,它meand:OutOfMemory,BrokenRam,JRE的FaultyImplementation等......基本上告訴你的東西:程序因為PC崩潰而無法運行....

只需2美分。 有人經歷過同樣的事嗎?

PS:關於連續刪除堆棧跟蹤:

一旦看到異常,就嘗試使用例如NullpointerException來捕獲它。 當你看到Nullpointerexception轉到你的代碼並刪除堆棧跟蹤,只是log.WARN(NullpointerOccured)並寫你的程序重試等等...

理想情況下,你重復,直到你再也看不到Stacktrace。 當你看不到堆棧跟蹤時,意味着所有可能出錯的事情都會被處理掉 (當然除了RuntimeException)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM