0

第一个来自一本对我来说非常神秘/复杂的书,第二个是我看到我周围的人写的方式,包括我:),对于第一个风格的 eclipse 也显示了 catch "IOException openx" 块是处理发生读写的部分的异常,即

while ((len = is.read(buf)) >= 0)
out.write(buf, 0, len);

.这是否意味着捕获“IOException iox”是无用的代码?

第一种风格。

File file = new File("hsjdhsaj");
        InputStream is = null;
        try {
            URL url = new URL("");
            is = url.openStream();
            OutputStream out = new FileOutputStream(file);
            try {
                byte[] buf = new byte[4096];
                int len;
                while ((len = is.read(buf)) >= 0)
                    out.write(buf, 0, len);
            } catch (IOException iox) {
            } finally {
                try {
                    out.close();
                } catch (IOException closeOutx) {
                }
            }
        } catch (FileNotFoundException fnfx) {
        } catch (IOException openx) {
        } finally {
            try {
                if (is != null)
                    is.close();
            } catch (IOException closeInx) {
            }
        }

第二种风格。

    File file = new File("hsjdhsaj");
        InputStream is = null;
        OutputStream out = null;
        try {
            URL url = new URL("");
            is = url.openStream();
            out = new FileOutputStream(file);

            byte[] buf = new byte[4096];
            int len;
            while ((len = is.read(buf)) >= 0)
                out.write(buf, 0, len);

        } catch (FileNotFoundException fnfx) {
        } catch (IOException openx) {
        } finally {
            try {
                if (out != null)
                out.close();
                if (is != null)
                    is.close();
            } catch (IOException closeInx) {
            }
        }

如果我把

try { 
if (is != null) is.close();
} catch (IOException closeInx) { }
try {
if (out != null) out.close(); 
} catch (IOException closeInx) { }

在 finally 块中选择第二种样式,那么它们是否都相同

4

3 回答 3

2

用第二种风格is不关闭时out.close()抛出异常。第一种风格没有这个问题。

在这两个代码片段中,异常经常被默默地吞下。这可能会导致维护噩梦。有些东西不起作用,你不知道为什么。

于 2013-01-03T17:32:24.447 回答
2

第一种方法更正确。如果调用时抛出异常,您的第二种方法会出现错误out.close,因为您永远不会调用is.close().

当然,他们俩都很丑。您应该使用IOUtils.closeQuietly() 之类的实用方法来关闭您的流。而且你不应该吞下异常。

于 2013-01-03T17:32:35.690 回答
1

是的,第一个更正确,但也很丑陋。这就是 Java 7 改进了很多异常处理的原因。在您的情况下,您可以使用Try-with-Resources

新语法允许您声明属于 try 块的资源。这意味着您提前定义资源,运行时会在执行 try 块后自动关闭这些资源(如果它们尚未关闭)。

   try (BufferedReader reader = new BufferedReader(
    new InputStreamReader(
    new URL("http://www.yoursimpledate.server/").openStream())))
   {
    String line = reader.readLine();
    SimpleDateFormat format = new SimpleDateFormat("MM/DD/YY");
    Date date = format.parse(line);
   } catch (ParseException | IOException exception) {
    // handle I/O problems.
   }

查看使用 Java SE 7 异常更改

于 2013-01-03T17:39:44.120 回答