[英]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.