5

私はいくつかの答えを探しましたが、見つけることができなかったので、これを新しい質問として提起しています。try-catchのcatchメソッド。それは方法ですか?、引数としてException型のオブジェクトを取ります。しかし、その方法であれば、

  1. 誰がこのメソッドを呼び出し、どのオブジェクトによってこのメソッドが呼び出されますか?

  2. 通常、別のメソッド定義内にメソッド定義を書き込むことはできませんが、そのメソッドの場合、別のメソッド内にキャッチを書き込むにはどうすればよいですか?

  3. それが方法ではない場合、それは何ですか?

     public void foo() {
    
         try { ; 
    
         } catch (Exception ex) {
    
              ; // this is catch method body 
          }
    
    }
    

上記のコードは、catchメソッドの本体が別のメソッドfoo()の本体の中にあることを意味します。

4

6 に答える 6

11

Exceptionいいえ、これは、がキャッチされた場合に実行されるコードのブロックを示す特別なJava構造であり、メソッドではありません。そのコードブロックは(ある種の)パラメーターを取りますが、これはキャッチして処理するための例外ですが、これはメソッドにはなりません。

コメントで指摘されているように、これは、たとえばifステートメントに似ています(ブール式である「パラメーター」を取ると見なすことができますが、同様にこれもメソッドではありません)。

于 2012-10-11T09:09:40.560 に答える
5

これは、if、while、forに似た言語構造です。

于 2012-10-11T09:10:43.880 に答える
2

誰がこのメソッドを呼び出し、どのオブジェクトによってこのメソッドが呼び出されますか?

指定された例外または派生例外がスローされた場合、JVMはそれを実行します。呼び出しはありません。

通常、別のメソッド定義内にメソッド定義を書き込むことはできません。

匿名のクラスを書く以外にそれを行うことはできませんが、それは別の話です。

だからそれが方法なら

そうではありません。

別のメソッド内にキャッチを書き込むにはどうすればよいですか?

それは方法ではないからです。

それが方法ではない場合、それは何ですか?

これは、try、do、for、for、switch、case、class、interface、...areと同じように言語構造です。

上記のコードは、catchメソッドの本体が別のメソッドfoo()の本体の中にあることを意味します。

いいえ、方法ではないので、そうではありません。

確かに、これらすべての自己矛盾は、それが方法ではないことを明らかにしていますか?

于 2012-10-11T09:28:28.663 に答える
1

これは、のようなブロックでありifwhileと呼ばれる1つのパラメーターのみを受け入れますexception parameter

JLS#14.20から 。tryステートメント

tryステートメントはブロックを実行します。値がスローされ、tryステートメントにそれをキャッチできる1つ以上の句がある場合、制御は最初のそのような句catchに移されます。catchtryステートメントに句がある場合、ブロックが正常に完了するか突然完了するかに関係なく、また句が最初に制御finallyされるかどうかに関係なく、別のコードブロックが実行されます。trycatch

catch句には、と呼ばれるパラメータが1つだけありますexception parameter

CatchClause:
   catch ( CatchFormalParameter ) Block
于 2012-10-11T09:29:48.723 に答える
0

キャッチは方法ではありません。try-catchブロックはdo-whileブロックに似ています。

do{
   statements;
} while (condition);

各catchブロックは例外ハンドラーであり、引数で示される例外のタイプを処理します。

于 2012-10-11T09:22:46.867 に答える
0

確かに、try-cathは方法ではありません。これは、if-elseに似た構造です。しかし、それは方法でなければなりません。

私にとって、それは言語の欠陥です。メソッドは1つのアクションのみを実行する必要があります。パンを購入するアクションのみを実行する「buyBread()」というメソッドがあるとします。それで何か問題が発生した場合、その例外を処理することは、もはやパンを購入することの一部ではありません。したがって、別の方法で行う必要があります。(救急車を呼ぶことはあなたの車を運転することの一部ではないように、それはあなたの車を運転することが非常にひどい方法で失敗したときにあなたがすることの一部です)。したがって、「try」で行うことは、「catch」で行うことと同じ方法であってはなりませんが、Javaではそれを行うことはできません。

私はjavaを次のようにしたいと思います:

buyEverythingInShoppingList(...){
...
    try {
        buyBread()
    } catch(this::solveBuyBreadFailure)
...
}

private void solveBuyBreadFailure(Exception e){
    if (e.cause.equals(NO_MONEY){
        begForBread()
    } else {
        giveUpAndCry()
    }
}
于 2021-02-19T13:38:44.010 に答える