私は例外について多くのことを読んだことがありますが、私は一緒にすべてを組み立てるのに苦労しています...私はファイルを読むためのユーティリティメソッドを書こうとしています(これは練習用ですので興味はありません)ライブラリを使用して:エラーを正確に特定する最も良い方法は何ですか?
public static List<String> readFile(String file)
throws NoSuchFileException,
AccessDeniedException,
SomeException1,
SomeException2,
IOException {
Path p = Paths.get(file);
if (!Files.exists(p)) {
throw new NoSuchFileException(file);
} else if (!Files.isRegularFile(p)) {
throw new SomeException1(file);
} else if (!Files.isReadable(p)) {
throw new AccessDeniedException(file);
} else if (Files.size(p) == 0) {
throw new SomeException2(file);
}
return Files.readAllLines(p);
}
public static void main(String[] args) {
try {
if (args.length != 2) {
System.out.println("The proper use is: java MyProgram file1.txt file2.txt");
return;
}
List<List<String>> files = new ArrayList<>();
for (int i = 0; i < args.length; i++) {
try {
files.add(Utilities.readFile(args[i]));
} catch (NoSuchFileException e) {
System.out.printf("File %s does not exist%n", e.getMessage());
System.exit(-1);
} catch (SomeException1 e) {
System.out.printf("File %s is not a regular file%n", e.getMessage());
throw e;
} catch (AccessDeniedException e) {
System.out.printf(
"Access rights are insufficient to read file %s%n", e.getMessage()
);
throw new AccessDeniedException(e);
} catch (SomeException2 e) {
System.out.printf("File %s is empty%n", e.getMessage());
throw new SomeOtherException(e);
}
}
} catch (Exception e) {
e.printStackTrace();
}
私は後でそれらをキャッチし、ユーザーに関連するエラーメッセージを書き込みますが、これは悪い見ることができますので、正確な例外をスローしたい...と、これを行うには良い方法はありますか?
私が見るいくつかの問題がここにありますが私の考えです:
- 私は、これは例外的なケースである、フロー制御ではないかなり確信しているので、私は例外を使用する必要があります。
- 一般的な例外をスローすることはできません。エラーの原因を特定できません。
- 一方、これはあまりにも多くの例外のように、メソッドのシグネチャを汚染するように感じます。さらに、チェックされていない例外を使用することはできません。プログラマのエラーではなく、処理できます。
- そして、私の使用事例で十分正確な標準例外を見つけることはできません。あなたの例外は、すべての由来している場合は
- しかし、私は、これは例外のカスタムタイプを作成するための適切な時期があるのかはわからないか、これが問題に対処するために間違った方法であれば...
elseは不要です。最初のifがtrueの場合、例外がスローされ、メソッドの残りの部分には到達しません。 – flup
ifsにする利点はありますか? – kevinlelo
彼らは多少読みやすくなりますが、それは味の問題です。プラスあなたはそれらをオンライナーにすることができます。 – flup