[英]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);
抛出MalformedURLException
和is.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-catch
和resource
否则必须在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.