1
public int countChars3(String fileName) {
        int total = 0;
        FileReader r = null;
        try {
            r = new FileReader(fileName);
        } catch (FileNotFoundException e) {
            System.out.println("File named " + fileName + " not found. " + e);
            total = -1;
        }
        try {
            while (r.ready()) {
                try {
                    r.read();
                } catch (IOException e) {
                    System.out.println("IOException" + "occurred while counting " + "chars. " + e);
                    total = -1;
                }
                total++;
            }
        } catch (IOException e) {
            System.out.println("IOExceptionoccurred while counting chars. " + e);
            total = -1;
        }
        try {
            r.close();
        } catch (IOException e) {
            System.out.println("IOExceptionoccurred while counting chars. " + e);
            total = -1;
        }
        return total;
    }

上記のコードは、もつれた混乱のtry-catchブロックの例です。コードを読むと、それらは乱雑に見えます。ネストされたトライキャッチがいくつかあります。大まかに言えば、このもつれた混乱したコードブロックは何を実証しようとしていますか?

4

3 に答える 3

1

ファイルを見つけて開こうとし、次にそのファイル内の文字を数えようとします。次に、ファイルを閉じようとします。

個人的には、この種のコードを本番環境で作成することは決してありません。次のように、間に多くの処理が行われていない限り、これらすべてを実行して、すべてを1つのtry/catchブロックに入れようとします。

try {
    r = new FileReader(fileName);
    while(r.ready()) {
        r.read();
        total++;
    }
    r.close();
}
catch(IOException ioe) {
    //handle
}

もちろん、何が発生したかに関してIOExceptionをキャッチするときに、より具体的にしたい場合は、個別のブロックが必要です。これは、読みやすさと機能性の間のトレードオフです。

于 2012-11-02T03:25:52.040 に答える
1

メソッドにスローさせてクライアントに処理させるだけです。また、リソースを閉じるためにfinally{}を用意する必要があります。

public int countChars3(String fileName) throws IOException {
    int total = 0;
    FileReader reader = new FileReader(fileName);
    try {
        while (reader.ready()) {
            reader.read();
            total++;
        }
        reader.close();
    } finally {
        reader.close();
    }
    return total;
}

また、文字またはバイトをカウントすることを意味しています。バイトの場合、コード全体を次のように置き換えることができます。

return (int) new File(fileName).length();
于 2012-11-02T03:34:43.543 に答える
0

これは何を示していますか?

私は行くつもりです:壊れたコード。

これらすべてを1つのtry-catchに組み合わせると、読みやすくなるだけでなく、より正確になります。主な問題は、回復不能な例外(FileNotFoundなど)を早期にキャッチしても、残りのコードで続行されることです(ここでは、未処理のNPEがスローされます)。

于 2012-11-02T03:30:44.040 に答える