私は「throws」句を使用したことがありません。今日、仲間は、メソッドがスローする可能性のある例外をメソッド宣言で指定する必要があると言いました。しかし、私はそれを行わずに問題なく例外を使用してきました。それで、実際に必要なのに、なぜそれが必要なのですか?
6 に答える
Javaには、チェックされた例外とチェックされていない例外の2種類の例外があります。
チェックされていない例外はのサブクラスでRuntimeException
あり、throws宣言を追加する必要はありません。他のすべての例外は、try / catchステートメントまたはthrows宣言のいずれかを使用して、メソッド本体で処理する必要があります。
未チェックの例外の例:IllegalArgumentException
これは、メソッドが不正な引数で呼び出されたことを通知するために使用されることがあります。スローは必要ありません。
チェックされた例外の例:パッケージIOException
の一部のメソッドjava.io
がスローする可能性があります。try / catchを使用するかthrows IOException
、メソッド宣言に追加して、例外処理をメソッド呼び出し元に委任します。
メソッドがthrowsキーワードで宣言されている場合、そのメソッドを呼び出したい他のメソッドは、それをキャッチする準備をするか、それ自体が例外をスローすることを宣言する必要があります。
たとえば、アプリケーションを一時停止する場合は、を呼び出す必要がありますThread.sleep(milliseconds);
しかし、このメソッドの宣言は、InterruptedException
宣言:
public static void sleep(long millis) throws InterruptedException
したがって、たとえばmainメソッドで呼び出したい場合は、次のいずれかをキャッチする必要があります。
public static void main(String args[]) {
try {
Thread.sleep(1000);
} catch(InterruptedException ie) {
System.out.println("Opps!");
}
}
または、メソッドに例外をスローしていることも宣言させます。
public static void main(String args[]) throws InterruptedException {
Thread.sleep(1000);
}
チェックされた例外があっても、発生する可能性があります。そして時々それはロギングを壊すことができます。
ライブラリメソッドがこのトリックを使用して、次Runnable
をスローできる実装を許可するとしIOException
ます。
class SneakyThrowTask implements Runnable {
public void run() {
throwSneakily(new IOException());
}
private static RuntimeException throwSneakily(Throwable ex) {
return unsafeCastAndRethrow(ex);
}
@SuppressWarnings("unchecked")
private static <X extends Throwable>X unsafeCastAndRethrow(Throwable ex) throws X {
throw (X) ex;
}
}
そして、あなたはそれをこのように呼びます:
public static void main(String[] args) {
try {
new SneakyThrowTask().run();
} catch (RuntimeException ex) {
LOGGER.log(ex);
}
}
例外がログに記録されることはありません。そして、それはチェックされた例外であるため、これを書くことはできません:
public static void main(String[] args) {
try {
new SneakyThrowTask().run();
} catch (RuntimeException ex) {
LOGGER.log(ex);
} catch (IOException ex) {
LOGGER.log(ex); // Error: unreachable code
}
}
- メソッドがスローするチェック済み例外を宣言する必要があります。
- 'throws Exception'を宣言すると、すべてではないにしてもほとんどのチェック済み例外がカバーされます
- チェックされていないランタイム例外をいつでもスローでき、宣言する必要はありません。
チェックされた例外をスローしようとして、そのタイプをスローするようにメソッドを宣言していない場合、コードはコンパイルされません(今すぐチェックします)。
編集、そうですね。
public static void main(String[] args) {
throw new Exception("bad");
}
コンパイルエラーが発生します。
特にあなたの質問のために、例外をスローするように宣言されたメソッドを呼び出す場合は、メソッドの呼び出しを試行/キャッチするか、メソッドが例外をスローすることを宣言する必要があります。
throws
キーワードは、別のメソッドに例外をスローするために使用されます。
これにより、ユーザーへのハンドル例外が緩和されます。その場合、すべての例外は、実行に使用されるメソッドで処理できるためです。
ほとんどの場合、これは主にメソッドであるため、ユーザーはメソッドの内部を探索する必要はありません。
また、発生する可能性のある例外を処理するために、キーワードforceをコンパイラーにスローします。
API開発者の場合、コードを作成すると例外が発生する可能性があるためthrows
、メソッドの実行時にキーワードを使用してそれを処理します。
Javaはキーワードをスローします
- Java
throws
キーワードは、例外を宣言するために使用されます。 throws
クラスが続きます。- チェックされた例外は、で伝播できます
throws
。 - これは、例外に関する情報をメソッドの呼び出し元に提供します。
throws
例、
void m()throws ArithmeticException{
//method code
}