5

我已经搜索了一些答案,但找不到,因此我将其作为一个新问题提出。try-catch 中的 catch 方法。它是一种方法吗?, 它以 Exception 类型的对象作为参数。但如果它是一种方法,

  1. 谁调用了这个方法,这个方法被哪个对象调用了?

  2. 你不能在另一个方法定义中正常写一个方法定义。所以如果它是一个方法,我怎么能在另一个方法中写catch?

  3. 如果它不是一种方法,那它是什么?

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

上面的代码意味着 catch 方法体在另一个方法 foo() 的体内。

4

6 回答 6

11

不,它是一个特殊的 Java 结构,表示如果Exception捕获到一个要运行的代码块,它不是一个方法。该代码块确实接受了一个参数(各种),这是要捕获然后处理的异常 - 但这并不能使其成为一种方法。

正如评论中所指出的,它类似于 if 语句(您可以将其视为采用布尔表达式的“参数”,但同样这也不是一种方法。)

于 2012-10-11T09:09:40.560 回答
5

它是一种类似于 if 或 while 或 for 的语言结构

于 2012-10-11T09:10:43.880 回答
2

谁调用了这个方法,这个方法被哪个对象调用了?

如果抛出指定的异常或派生的异常,JVM就会执行它。没有呼唤。

您通常不能在另一个方法定义中编写方法定义。

除了编写一个匿名课程之外,您根本无法做到这一点,但那是另一回事了。

所以如果它是一种方法

它不是。

我怎么能在另一个方法中写下 catch ?

因为它不是一种方法。

如果它不是一种方法,那它是什么?

它是一种语言结构,就像 try、do、while、for、switch、case、class、interface 等一样。

上面的代码意味着 catch 方法体在另一个方法 foo() 的体内。

不,它没有,因为它不是一种方法。

当然,所有这些自相矛盾都表明它不是一种方法?

于 2012-10-11T09:28:28.663 回答
1

它是一个类似于 的块ifwhile它只接受一个称为 as 的参数exception parameter

来自 JLS #14.20。尝试语句

一条try语句执行一个块。如果抛出一个值并且try语句有一个或多个catch可以捕获它的子句,则控制将转移到第一个这样的catch子句。如果 try 语句有finally子句,则执行另一个代码块,无论该try块是正常完成还是突然完成,也不管catch子句是否首先被赋予控制权。

catch子句只有一个参数,称为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 的构造。但它应该是一种方法。

对我来说,这是语言的缺陷。一个方法应该只做一个动作。假设您有一个名为“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 回答