在 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);
抛出 MalformedURLException
而 is.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-catch
与 resource
一起使用。
有什么方法可以实现上面提到的objective(如果可能的话只用一个try-catch
块)?
方法 1,但没有 finally
关闭流,而是 try-with-resources
语句。
请注意,在您的代码中,is.close();
语句将抛出 NullPointerException
如果 is
是 null
,而 IOException
被 URL
抛出。
通过将流关闭任务留给 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();
}
我有一段代码可以从给定的 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
。
我的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-catch
与 resource
一起使用。
有什么方法可以实现上面提到的objective(如果可能的话只用一个try-catch
块)?
方法 1,但没有 finally
关闭流,而是 try-with-resources
语句。
请注意,在您的代码中,is.close();
语句将抛出 NullPointerException
如果 is
是 null
,而 IOException
被 URL
抛出。
通过将流关闭任务留给 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();
}