0

最初のものは私には非常に謎めいた/複雑に見える本からのものです.2番目のものは私を含む私の周りの人々が書いているのを見た方法です:)、また最初のスタイルの日食はcatch "IOException openx"ブロックが読み取りと書き込みが行われている部分の例外を処理する

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

.catch "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) { }

2番目のスタイルの最終ブロックでは、両方とも同じですか

4

3 に答える 3

2

最初のアプローチはより正確です。を呼び出すときに例外がスローされた場合、2 番目のアプローチにはバグがout.closeありますis.close()

もちろん、どちらも醜いです。ストリームを閉じるには、 IOUtils.closeQuietly()などのユーティリティ メソッドを使用する必要があります。また、例外を飲み込んではいけません。

于 2013-01-03T17:32:35.690 に答える
2

2 番目のスタイルでは、例外がスローisされたときに閉じられません。out.close()最初のスタイルにはこの問題はありません。

どちらのコード スニペットでも、多くの場合、例外は黙って飲み込まれます。これにより、メンテナンスの悪夢が発生する可能性があります。何かが機能せず、その理由がわかりません。

于 2013-01-03T17:32:24.447 に答える
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.
   }

Working with Java SE 7 Exception Changes をご覧ください。

于 2013-01-03T17:39:44.120 に答える