繁体   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