簡體   English   中英

在try catch塊中處理MalformedURLException異常

[英]Handle MalformedURLException exception inside try catch block

我有一段代碼可以從給定的URL下載文件。 我正在使用InputStream從流中讀取數據。

public static byte[] fetchAttachmentFromThisURL(String path) {
    String urlString = ORBEON_BASE + path;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    URL obj = new URL(urlString);
    InputStream is = obj.openStream();
    int n;
    byte[] byteChunk = new byte[4096];
    while ((n = is.read(byteChunk)) > 0) {
        baos.write(byteChunk, 0, n);
    }
    is.close();
    return baos.toByteArray();
}

URL obj = new URL(urlString); 拋出MalformedURLExceptionis.close(); 拋出IOException

我的目標是處理fetchAttachmentFromThisURL方法內的所有異常。 我不想在方法中使用throws關鍵字。

方法設計1:

public static byte[] fetchAttachmentFromThisURL(String path) {
    String urlString = ORBEON_BASE + path;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    InputStream is = null;
    try {
        URL obj = new URL(urlString);
        is = obj.openStream();
        int n;
        byte[] byteChunk = new byte[4096];
        while ((n = is.read(byteChunk)) > 0) {
            baos.write(byteChunk, 0, n);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        is.close();
    }
    return baos.toByteArray();
}

finally ,必須有另一個try-catch塊來處理IOException ,這絕對不是一種更干凈的方法。

方法設計2:

public static byte[] fetchAttachmentFromThisURL(String path) {
    String urlString = ORBEON_BASE + path;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    URL obj = new URL(urlString);
    try (InputStream is = obj.openStream()) {
        int n;
        byte[] byteChunk = new byte[4096];
        while ((n = is.read(byteChunk)) > 0) {
            baos.write(byteChunk, 0, n);
        }
    } catch (IOException e) {
        e.printStackTrace();            
    }
    return baos.toByteArray();
}

此處,由於obj初始化引發MalformedURLException ,因此存在編譯時錯誤。 同樣,我無法在try塊內移動此初始化行,因為這樣做會使obj不可見。

除非使用try-catchresource否則必須在finally塊中關閉輸入流。

有什么方法可以達到上述目的(如果可能,只能使用一個try-catch塊)?

方法1,但是沒有finally關閉流,而是使用了try-with-resources語句。
請注意,您的代碼中的is.close(); 如果URL拋出IOException ,則該語句將為NullPointerException如果is null 通過將流關閉任務留給JVM,您可以避免添加的check和finally

public static byte[] fetchAttachmentFromThisURL(String path) {
    String urlString = ORBEON_BASE + path;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    try (InputStream is = new URL(urlString).openStream()) {                       
        int n;
        byte[] byteChunk = new byte[4096];
        while ((n = is.read(byteChunk)) > 0) {
            baos.write(byteChunk, 0, n);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } 
    return baos.toByteArray();
}

Eclipse IDE提出了這種設計。 我認為不應有任何資源泄漏以及異常情況。

public static byte[] fetchAttachmentFromThisURL(String path) {
    String urlString = "" + path;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        URL obj = new URL(urlString);
        int n;
        byte[] byteChunk = new byte[4096];
        while ((n = obj.openStream().read(byteChunk)) > 0) {
            baos.write(byteChunk, 0, n);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return baos.toByteArray();
}

暫無
暫無

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

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