在 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

我的objective是处理方法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 不可见。

必须在 finally 块中关闭输入流,除非将 try-catchresource 一起使用。

有什么方法可以实现上面提到的objective(如果可能的话只用一个try-catch块)?

方法 1,但没有 finally 关闭流,而是 try-with-resources 语句。
请注意,在您的代码中,is.close(); 语句将抛出 NullPointerException 如果 isnull,而 IOExceptionURL 抛出。 通过将流关闭任务留给 JVM,您可以避免添加检查 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();
}