如何将错误捕获留给子类?
How to leave the error catching to the subclass?
public class First {
protected void method1() throws CustomException {
int number=10/0;
System.out.println("method 1" + number);
throw new CustomException("Divided by zero");
}
public class Second extends First {
protected void method2() {
method1();
}
public class Third extends Second {
protected void method3(){
try {
method2();
}
catch (CustomException ex)
{
System.out.println("Caught the exception");
System.out.println(ex.getMessage());
}
}
在这段代码中,第一个抛出异常,我想从第三个中捕获它(第二个不会处理错误)。但是第二个方法调用不会让我通过。我该如何解决这个问题?
对于已检查的异常(不是任何RuntimeException
),它们必须由调用另一个抛出异常的方法的方法处理或抛出。 Oracle 在 Exceptions.
上的教程中也对此进行了更深入的解释
此示例基于您的代码:
class Testing{
public static void main(String[] args) {
Third t = new Third();
t.method3();
}
}
它会打印:
Caught the exception
Divided by zero
添加了 CustomException
缺少的实现:
class CustomException extends Exception{
CustomException(){
super();
}
CustomException(String message){
super(message);
}
}
请注意,您的代码永远不会真正抛出异常,因为除以零会首先抛出异常。 ArithmeticException
是一个 RuntimeException
,因此不是检查异常,它不需要或保证任何声明。我已将其删除,因此抛出了您的异常:
class First {
protected void method1() throws CustomException {
// will cause "java.lang.ArithmeticException: / by zero" not CustomException
// int number=10/0;
// System.out.println("method 1" + number);
throw new CustomException("Divided by zero");
}
} // missing end brace
你的 Second
方法调用“不让我通过”的原因是你在 method1
中抛出一个 Exception
Second
的方法调用。因此,您需要将对 method1()
的调用包装在 try-catch 块中,或者 throws
。因为你“想从第三个抓住它”,你需要在方法的声明中 throws
它:
class Second extends First {
// error: unreported exception CustomException; must be caught or declared to be thrown
// protected void method2() { // your version
protected void method2() throws CustomException {
method1();
}
} // missing end brace
这没有变化,除了添加了大括号:
class Third extends Second {
protected void method3(){
try {
method2();
} catch (CustomException ex) {
System.out.println("Caught the exception");
System.out.println(ex.getMessage());
}
}
} // missing end brace
public class First {
protected void method1() throws CustomException {
int number=10/0;
System.out.println("method 1" + number);
throw new CustomException("Divided by zero");
}
public class Second extends First {
protected void method2() {
method1();
}
public class Third extends Second {
protected void method3(){
try {
method2();
}
catch (CustomException ex)
{
System.out.println("Caught the exception");
System.out.println(ex.getMessage());
}
}
在这段代码中,第一个抛出异常,我想从第三个中捕获它(第二个不会处理错误)。但是第二个方法调用不会让我通过。我该如何解决这个问题?
对于已检查的异常(不是任何RuntimeException
),它们必须由调用另一个抛出异常的方法的方法处理或抛出。 Oracle 在 Exceptions.
此示例基于您的代码:
class Testing{
public static void main(String[] args) {
Third t = new Third();
t.method3();
}
}
它会打印:
Caught the exception
Divided by zero
添加了 CustomException
缺少的实现:
class CustomException extends Exception{
CustomException(){
super();
}
CustomException(String message){
super(message);
}
}
请注意,您的代码永远不会真正抛出异常,因为除以零会首先抛出异常。 ArithmeticException
是一个 RuntimeException
,因此不是检查异常,它不需要或保证任何声明。我已将其删除,因此抛出了您的异常:
class First {
protected void method1() throws CustomException {
// will cause "java.lang.ArithmeticException: / by zero" not CustomException
// int number=10/0;
// System.out.println("method 1" + number);
throw new CustomException("Divided by zero");
}
} // missing end brace
你的 Second
方法调用“不让我通过”的原因是你在 method1
中抛出一个 Exception
Second
的方法调用。因此,您需要将对 method1()
的调用包装在 try-catch 块中,或者 throws
。因为你“想从第三个抓住它”,你需要在方法的声明中 throws
它:
class Second extends First {
// error: unreported exception CustomException; must be caught or declared to be thrown
// protected void method2() { // your version
protected void method2() throws CustomException {
method1();
}
} // missing end brace
这没有变化,除了添加了大括号:
class Third extends Second {
protected void method3(){
try {
method2();
} catch (CustomException ex) {
System.out.println("Caught the exception");
System.out.println(ex.getMessage());
}
}
} // missing end brace