25

私は「throws」句を使用したことがありません。今日、仲間は、メソッドがスローする可能性のある例外をメソッド宣言で指定する必要があると言いました。しかし、私はそれを行わずに問題なく例外を使用してきました。それで、実際に必要なのに、なぜそれが必要なのですか?

4

6 に答える 6

27

Javaには、チェックされた例外とチェックされていない例外の2種類の例外があります。

チェックされていない例外はのサブクラスでRuntimeExceptionあり、throws宣言を追加する必要はありません。他のすべての例外は、try / catchステートメントまたはthrows宣言のいずれかを使用して、メソッド本体で処理する必要があります。

未チェックの例外の例:IllegalArgumentExceptionこれは、メソッドが不正な引数で呼び出されたことを通知するために使用されることがあります。スローは必要ありません。

チェックされた例外の例:パッケージIOExceptionの一部のメソッドjava.ioがスローする可能性があります。try / catchを使用するかthrows IOException、メソッド宣言に追加して、例外処理をメソッド呼び出し元に委任します。

于 2011-02-03T18:03:58.770 に答える
14

メソッドが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);
}
于 2011-02-03T18:04:04.657 に答える
7

チェックされた例外があっても、発生する可能性があります。そして時々それはロギングを壊すことができます。

ライブラリメソッドがこのトリックを使用して、次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
    }
}
于 2011-02-03T19:04:13.460 に答える
4
  1. メソッドがスローするチェック済み例外を宣言する必要があります。
  2. 'throws Exception'を宣言すると、すべてではないにしてもほとんどのチェック済み例外がカバーされます
  3. チェックされていないランタイム例外をいつでもスローでき、宣言する必要はありません。

チェックされた例外をスローしようとして、そのタイプをスローするようにメソッドを宣言していない場合、コードはコンパイルされません(今すぐチェックします)。

編集、そうですね。

public static void main(String[] args) {
   throw new Exception("bad");
}

コンパイルエラーが発生します。

特にあなたの質問のために、例外をスローするように宣言されたメソッドを呼び出す場合は、メソッドの呼び出しを試行/キャッチするか、メソッドが例外をスローすることを宣言する必要があります。

于 2011-02-03T17:55:00.643 に答える
3

throwsキーワードは、別のメソッドに例外をスローするために使用されます。

これにより、ユーザーへのハンドル例外が緩和されます。その場合、すべての例外は、実行に使用されるメソッドで処理できるためです。

ほとんどの場合、これは主にメソッドであるため、ユーザーはメソッドの内部を探索する必要はありません。

また、発生する可能性のある例外を処理するために、キーワードforceをコンパイラーにスローします。

API開発者の場合、コードを作成すると例外が発生する可能性があるためthrows、メソッドの実行時にキーワードを使用してそれを処理します。

于 2018-06-23T01:48:06.243 に答える
2

Javaはキーワードをスローします

  • Javathrowsキーワードは、例外を宣言するために使用されます。
  • throwsクラスが続きます。
  • チェックされた例外は、で伝播できますthrows
  • これは、例外に関する情報をメソッドの呼び出し元に提供します。

throws例、

void m()throws ArithmeticException{  
    //method code  
}  
于 2018-06-25T07:30:35.083 に答える