簡體   English   中英

Java跳過嘗試捕獲以拋出功能

[英]Java skip try catch for throwable fuction

我想知道Java中是否有一種方法可以“跳過”我認為不會拋出異常的可拋出函數的try-catch方法。

我有這段代碼:

DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date date = format.parse(dateString); // <-- Compiler error here
Log.i(PF.TAG, date.toString());

我收到編譯器錯誤,提示未處理異常

錯誤:(97,30)錯誤:未報告的異常ParseException; 必須被抓住或宣布被拋出

我可以通過將format.parse()放在try-catch中來擺脫此錯誤。

在Swift 2錯誤處理中,有一個選項可以try! someFunction() try! someFunction()將編譯並執行throwable函數,如果發生錯誤則崩潰。

Java中是否有類似的方法,所以我不必將所有我知道不會在任何地方的try-catch中引發異常的小任務放到哪里?

並非如此,但是您可以編寫一個輔助方法來欺騙編譯器,使他們認為未檢查的異常是未檢查的。 例如:

public static <T> T uncheck(Callable<T> callable) {
  try {
    return callable.call();
  } catch (Throwable t) {
    return rethrow(t);
  }
}

@SuppressWarnings("unchecked")
private static <E extends Throwable, T> T rethrow(Throwable t) throws E {
  throw (E) t;
}

您將像這樣使用它:

Date date = uncheck(() -> format.parse(dateString));

您還可以將已檢查的異常包裝為未檢查的異常,就像jOOL在這里所做的一樣。

並不是的。

在Java中,通常有兩種異常類型-選中(擴展Exception)或未選中(擴展RuntimeException)。

以某種方式處理已檢查的異常是強制性的,不這樣做就可能導致編譯時異常,例如您的情況。 有兩種處理方法:

  • 嘗試-抓塊。 如果需要,可以通過提供一個空的catch子句和一個有用的注釋來忽略,並指定為什么永遠不要發生這種情況。
    • throws聲明。 它是方法聲明的一部分,並將處理異常的責任轉移給已聲明方法的客戶端。

如果要模擬您提到的Swift構造,則需要這樣的內容:

try {
    someFunction()
} catch (Exception e) {
    throw new <some runtime exception>
}

這樣,您可以“吞下”已檢查的異常,停止其傳播,而是拋出一個非已檢查的運行時異常,該異常不會強制調用者對其進行處理,並且如果發生原始異常,則會導致崩潰。

您無法避免在某些時候處理該異常,因為它已被檢查,但是如果將調用重構為一個單獨的方法來處理該異常, 可以避免大量try-catch構造的需要:

public class DateUtils {

    private DateUtils() { throw new AssertionError(); }

    public static Date parse(String toParse, DateFormat format) {
        try {
            return format.parse(toParse);
        catch (ParseException e) {
            // Exception handling code here. Maybe you want to log the error
            // somewhere? Then either re-throw as a RuntimeException or return some
            // default value.
        }
    }
}

然后,您將執行以下操作:

DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date date = DateUtils.parse(dateString, format);
Log.i(PF.TAG, date.toString());

暫無
暫無

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

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