1

例外の使用方法を学んだばかりですが、RuntimeExceptionsは特にチェックされていないため、少し混乱しています。だから私はこのコードを持っています:

    String path = "foo/bar/local/stuff.txt";
    File file = new File(path);

そのパスが見つからない場合、これはFileNotFoundExceptionではありませんか?メソッドでそれを指定するにはどうすればよいですか?また、このステップの後、私は次のことを行います。

    File[] listFiles = file.listFiles();

次の場合も例外はスロー
されません。1。ディレクトリではなく、ファイルです。
2.存在しません。

これが初心者の質問のように思われる場合は申し訳ありませんが、私はまだ例外の使用方法を本当に知りません。誰かが明確にできますか?

4

6 に答える 6

1

わかりました、コードを追加しているので、新しい回答を追加するだけです。ファイルがディレクトリでない場合、listFiles メソッドは null を返します。独自の例外をスローするには、次のようにします。

public void exampleMethod() throws Exception {
    File[] files = someFile.listFiles();
    if(files == null) {
        throw new Exception("File is not a directory, and as such cannot list files");
        //You can also create your own exception class (extends Exception), and explicitly throw that, rather than just a general Exception
        return;
    }

}

例外をスローせずに印刷したいだけの場合は、次のようにします

new Exception("blah").printStackTrace();
于 2012-08-07T02:24:41.430 に答える
0

まず、ドキュメントによると:

public File(String pathname)

例外: NullPointerException- パス名引数が null の場合

をスローしFile file = new File(path);ませFileNotFoundException

1) ファイルであれば例外ではありません。

2) 存在しなくても例外はスローされません。

要するに、スローされる唯一の例外はNullPointerException、パス名が null の場合です。

一方、またはFile.createNewFile()をスローできます。セキュリティ例外をスローすることもできます。IOExceptionSecurityExceptionFile.ListFiles()

于 2012-08-07T02:16:43.173 に答える
0

うーん、これは私が探しているアプローチではないと思います。現在、例外はスローされません。しかし、これらの状況でコードが失敗することはわかっているので、それらの状況に適切に対処できるように、コードに例外を追加する方法を知りたいです。

例外はスローしません。listFiles()ドキュメントでは、次のように述べています。

この抽象パス名がディレクトリを示さない場合、または I/O エラーが発生した場合は null を返します。

したがって、ファイルまたは存在しないファイルの場合は、null が返されます。

しかし、ここで RuntimeException の出番です。あなたが書いたメソッドで言うと:

public void doStuffToAnExistingDirectory(String dirname)
{
    // stuff
}

そして、メソッドは、既存の directory のディレクトリ名を期待するように記述されており、そのメソッドのどこかでこれを行います。

    File file = new File(dirname);
    File[] listFiles = file.listFiles();
    int num = listFiles.length;

これは、既存のディレクトリを示さないNullPointerException場合にスローします。dirnameこの例外はRuntimeであるため、メソッドでキャッチしたり宣言したりする必要はなく、doStuffToAnExistingDirectory()最終的に何かがキャッチするまで伝搬させることができます。これは基本的に、ディレクトリが存在しない例外を処理するようにメソッドが作成されていないことを示しています。したがって、このプログラムの実行中に、dirname何らかの形で存在しないディレクトリになると、ランタイム例外がスローされます。

コードでこのケースを処理することを選択できます (実行時ではなく、プログラムの実行中) listFiles。null かどうかを確認してから、独自の例外をスローして、呼び出しているものを許可します。メソッドは、doStuffToAnExistingDirectory()存在しないディレクトリを提供したことを認識しています。

于 2012-08-07T02:20:32.190 に答える
0

メソッドがスローする例外を署名で宣言することもできます。

public void foo() throws FileNotFoundException
于 2012-08-07T02:08:41.223 に答える
0

File(String) コンストラクターは FileNotFoundException をスローできないため、質問の前半について特別なことを行う必要はありません。

File#listFiles()も FileNotFoundException をスローしません。アクセスが拒否された場合は SecurityException をスローできますが、それだけです。ファイルがディレクトリでないか存在しない場合、メソッドは単純に null を返すため、リストされたファイルを使用する前に nullcheck を行う必要があります。

File[] files = file.listFiles();
if (files != null) {
    // file exists and is a directory
    // interact with files
}

実際の例外の使用に関してはthrows、メソッドが上記の例外をスローする可能性があること、およびメソッドがその例外がスローされる発生を処理しないことをコンパイラーに通知する場合は、ステートメントを追加できます。

public void someMethod() throws IOException, SecurityException { /*...*/ }
于 2012-08-07T02:09:51.820 に答える
0

File仮想概念です。Java では、 aFileは存在しないことが許可されています (そのため、 がありますFile.exists())。これにより、「可能な」場所を指定できます (書き込み先など)。

また、必要なファイルが存在するかどうかを確認して、開発者が決定を下せるようにすることもできます (ファイルを上書きする、ファイルをロードしない、ロックファイルに対して何か他のことを行う)。

listFiles別の獣です。IOExceptionおそらく、 「ファイル」をリストしようとした場合、またはディレクトリが存在しない場合は、おそらく何らかのスローが発生するはずです。これは、Java 1 以降、API の一部となっています。これは、当時の設計パラダイムが、私たちが知っているものとは異なっていたことを示唆しています。

Propertiesこれは、クラスへの変更でsave確認できますstoreIOException

Java 7 は、これらの欠点のいくつかを改善し、ファイル操作のためのより優れた作業モデルを導入するのに役立つ新しい API を導入しました。

于 2012-08-07T02:13:02.270 に答える