这是我的代码:
class FinallyDemo {
static void myMethod(int n) throws Exception{
try {
switch(n) {
case 1:
System.out.println("1st case");
return;
case 3:
System.out.println("3rd case");
throw new RuntimeException("3!");
case 4:
System.out.println("4th case");
throw new Exception("4!");
case 2:
System.out.println("2nd case");
}
catch (RuntimeException e) {
System.out.print("RuntimeException: ");
System.out.println(e.getMessage());
} finally {
System.out.println("try-block entered.");
}
}
public static void main(String args[]){
for (int i=1; i<=4; i++) {
try {
FinallyDemo.myMethod(i);
} catch (Exception e){
System.out.print("Exception caught: ");
System.out.println(e.getMessage());
}
System.out.println();
}
}
}
现在,它不会这样工作:
如果我在方法本身中有一个try和catch块,那么我不需要写
method_name(int n) throws Exception
?
在抛出异常的方法中没有try-catch块阻止在抛出异常的方法中写“抛出异常”吗?
答案 0 :(得分:3)
在您的示例中,case 4抛出异常,而在catch中只是捕获RuntimeException。由于没有异常的catch,你的方法需要声明它抛出Exception。 如果要为Exception添加catch,则不需要抛出Exception。这将有效。
static void myMethod(int n) {
try {
switch (n) {
case 1:
System.out.println("1st case");
return;
case 3:
System.out.println("3rd case");
throw new RuntimeException("3!");
case 4:
System.out.println("4th case");
throw new Exception("4!");
case 2:
System.out.println("2nd case");
}
} catch (RuntimeException e) {
System.out.print("RuntimeException: ");
System.out.println(e.getMessage());
} catch (Exception e) {
System.out.print("Exception: ");
System.out.println(e.getMessage());
}
finally {
System.out.println("try-block entered.");
}
}
答案 1 :(得分:1)
当且仅当被捕获的异常类型被捕获时(或者如果它扩展throws
),您不需要RuntimeException
子句。在您的情况下,您抛出Exception
使用语句throw new Exception("4!");
,但只捕获类型RuntimeException
。
如果为Exception
添加catch块,则不再需要throws
子句。例如:
static void myMethod(int n) throws Exception{
try {
switch(n) {
case 1:
System.out.println("1st case");
return;
case 3:
System.out.println("3rd case");
throw new RuntimeException("3!");
case 4:
System.out.println("4th case");
throw new Exception("4!");
case 2:
System.out.println("2nd case");
}
} catch (RuntimeException e) {
System.out.print("RuntimeException: ");
System.out.println(e.getMessage());
} catch(Exception e) {
System.out.print("Exception: ");
System.out.println(e.getMessage());
} finally {
System.out.println("try-block entered.");
}
}
答案 2 :(得分:1)
是的,前提是您正在捕获该方法可以抛出的所有异常类型。
在您的代码中,您抛出一个Exception
但不为其提供catch
块(您只捕获RuntimeException
),因此您必须将您的方法声明为throw {{ 1}}
你需要:
Exception
答案 3 :(得分:0)
在抛出异常的方法中没有try-catch块阻止在抛出异常的方法中写“抛出异常”吗?
不,你总是可以声明抛出异常,即使你不这样做。
除此之外,这对于允许子类抛出它们很有用(因为它们不允许添加额外的throw子句)。它还允许您稍后更改实现而不更改异常接口。
答案 4 :(得分:0)
现在是两类例外
Exception的子类被称为已检查异常,编译器确保在try / catch块中或通过修饰符在方法上抛出异常(或子类)来管理它们。
runlaseException的子类化被称为未经检查的异常,编译不需要任何管理它的机制。
现在,如果在方法上使用修饰符抛出异常(或子类),编译器将要求您使用try / catch管理它。
答案 5 :(得分:0)
由于您在交换机中同时抛出RuntimeException
和Exception
,您需要同时捕获两者或方法需要抛出Exception
,以便可以在方法中处理它致电myMethod
要同时使用:
catch (RuntimeException e) {
System.out.print("RuntimeException: ");
System.out.println(e.getMessage());
}catch (Exception e) {
System.out.print("Exception: ");
System.out.println(e.getMessage());
}
确保Exception
的捕获始终为最后一个,否则它将跟踪RuntimeException
,因为它延伸Exception
答案 6 :(得分:0)
您正在以两种方式处理异常。首先,如果扩展直接调用Exception类,就像在声明方法
时那样method_name(int n) throws Exception
这意味着无论在方法中发生什么类型的异常,它总是能够捕获它,例如,如果在方法内部发生了算术异常或NullPointerException或ArrayIndexOutOfBoundsException,您的上述声明将能够抓住他们每一个人。因此,没有将try catch块放在该方法中的实际目的,因为即使RunTimeException也是Exception Class层次结构的一部分。 因此,如果我正确理解你的问题,程序将执行,然后从catch块中捕获异常,否则它将从方法声明中捕获它。 希望它能回答你的问题。