簡體   English   中英

避免嵌套的try-catch塊

[英]Avoid nested try-catch blocks

我有以下Java代碼:

SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy mm:HH");
Date date;
try {
     date = df.parse(userString);
 } catch (ParseException e) {
     date = df.parse("07/12/2016 01:00");
     LOGGER.error("Could not parse date, reverting to default");
 }

因此,我想做的是將用戶輸入解析為日期,如果失敗,則將其替換為默認日期。

但是,第二個df.parse()需要一個自己的try-catch,即使我知道該值一定可以使用。 第二個parse不起作用沒有任何意義,如果確實不起作用,那么我無事可做,我最好終止該程序,因為世界已經結束了。 :)

有沒有一種方法可以避免需要第二個try-catch塊?

您說擁有第二次try-catch沒有任何意義。 這是正確的一半。 是的,您是說它不會失敗,但是Java不知道這一點。

您可以預先准備一個默認的日期參考,將其作為類成員存儲,然后返回該參考(但是您仍然需要對此進行嘗試-而且它不是一成不變的)。

嘗試減少代碼行沒有錯。 這個問題有幾個答案,這些答案可讓您無需嘗試就可以解決,但我認為這些會使代碼不太清晰,並且更容易出錯。 有一些思路,例如避免使用狀態標志,避免可為空的值,不重新分配變量等。

在這種情況下,我只會使用嵌套的try-catch並繼續您的生活。 它有點丑陋,但是比其他方法更安全,更清晰。

因此,盡管這不能解決您的問題,但我發布此答案是因為我認為回答問題會使您的代碼總體上變得更糟。 :)

這就是我編寫函數以實現最佳可讀性,可維護性和安全性的方式。

public Date parseDate(String userString) {
    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy mm:HH");
    try {
        return df.parse(userString);
    } catch (ParseException e) {
        LOGGER.error("Could not parse date '" + userString + "' reverting to default");
        try {
            return df.parse("07/12/2016 01:00");
        } catch (ParseException shouldntHappen) {
            throw new RuntimeException(shouldntHappen);
        }
    }
}

通過在ParseException isError標志檢查為true ,可以通過在finally塊中設置默認日期來避免嵌套try ,如下所示:

    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy mm:HH");
    Date date1;
    Date date2;
    boolean isError = false;
    try {
         date1 = df.parse("07/12/2016 01:00");
         date2 = df.parse(userString);
     } catch (ParseException e) {
         isError= true;
         LOGGER.error("Could not parse date, reverting to default");
     } finally {
         if(isError) {
             date2 = date1;
         }
     }

如果您的默認日期是預先確定的,這意味着如果您不必解析它,則可以使用

date = new Date(1468285200L * 1000); // unix time * 1000(milliseconds)

否則,只需像這樣使用SimpleDateFormat.parse(String text, ParsePosition pos) ;

date = df.parse("07/12/2016 01:00", new ParsePosition(0));

它不會引發任何ParseException而是根據解析是否成功返回日期或null

我會將這個功能移到一個方法上,然后可以重復使用

public static void main (String [] args) 
{

    Date dt = setDate ("07/12/2016 x1:00");
    if (dt == null) {
        dt = setDate ("07/12/2016 01:00");
    }

    System.out.println(dt);
}

private static Date setDate(String in) {

    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy mm:HH");
    Date date = null;
    try {
         date = df.parse(in);
     } catch (ParseException e) {
         System.out.println("Could not parse date, reverting to default");
     }      

    return date;
}

創建特定日期的正確方法是使用現有的日期時間類:

LocalDateTime local = LocalDateTime.of(2016, 7, 12, 1, 0);
ZonedDateTime zoned = ZonedDateTime.of(local, ZoneId.systemDefault());
date = Date.from(zoned.toInstant());

您也可以使用日歷。 如果您使用的Java版本早於Java 8,則日歷是執行此操作的唯一方法:

Calendar calendar = Calendar.getInstance();
calendar.set(2016, Calendar.JULY, 12, 1, 0, 0);
date = calendar.getTime();

警告:Calendar.JULY 等於7。使用月份常量可以避免錯誤。

ParseException是檢查的異常。 因此,您必須在try catch塊中或在方法聲明中編寫它,然后才寫引發PraseException。 但是,然后您的調用方法必須捕獲異常。 沒有其他方法可以避免檢查異常

暫無
暫無

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

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