0

私のプロジェクトには、すべて正常に動作する次のコード スニペットがあります。PropertyVetoException を発信者に伝播しようとしていました。try-catch ブロックを削除して書き込みpublic void actionPerformed(ActionEvent e)throws PropertyVetoException を行うと、コンパイル エラーが発生します。なぜそうなのですか?例外を呼び出し元に戻すにはどうすればよいですか。イベント生成メソッドが「呼び出し元」ではないことはわかっていますが、例外が発生したことを示す例外をこのイベント生成メソッドに伝播し、修正アクションを実行したいと考えています。

  public void actionPerformed(ActionEvent e) {
     if(CMD_CHILD.equalsIgnoreCase(e.getActionCommand())) {
          if(child.getTitle().equalsIgnoreCase(title)) {
              try {
                 child.setSelected(true);
              } catch (PropertyVetoException e1) {
                 e1.printStackTrace();
              }
           }
       }
   }
4

2 に答える 2

4

actionPerformedはインターフェイスによって指定されているためActionListener、そのインターフェイスでthrowsは、メソッドがチェック済みの例外をスローする可能性があることを示すものはありません。

スーパークラスからメソッドをオーバーライドするか、インターフェイスからメソッドを実装する場合、オーバーライドまたは実装するメソッドは、スーパークラスまたはインターフェイスで指定された以上の例外をスローできません。

それ以外に、なぜそれをしたいのですか?actionPerformedは Swing GUI フレームワークによって呼び出されますが、Swing は例外に対して何をすると思いますか?

于 2013-09-17T07:11:32.050 に答える
4

実装しているインターフェース ( ActionListener) は、メソッドに対する例外を宣言していませんactionPerformed。そのインターフェイスの実装クラスでメソッド シグネチャを変更することはできません。

RuntimeExceptionイベント プロデューサーに例外をスローする場合は、メソッド シグネチャで宣言する必要のない に変換できます。

} catch (PropertyVetoEception e1) {
    throw new RuntimeException(e1);
}

もちろん、RuntimeException少し一般的です。次のような独自のアプリケーション固有の例外を定義できます。

public class EventExecutionException extends RuntimeException {
    ...
}
于 2013-09-17T07:11:59.720 に答える