当有继承发生时,会伴随着重载、覆写(包括接口方法的实现)、构造器的重写等行为。此时,如果基类或是接口的方法存在异常声明,那么导出类或是接口的实现类的对应方法该如何声明异常?同时对这些方法的调用该如何捕捉异常?下面就这2个问题进行探讨,你会看到,针对覆写和构造器的重写是2种完全不同的处理方式(针对重载则没有任何限制)。代码如下:
Java代码
1.//@file Example1.java
2.
3.class ExtException extends Exception {}
4.class AnotherException extends Exception {}
5.
6.class Base
7.{
8. public void func() {}
9.
10. public void func2() throws Exception {}
11. public void func3() throws ExtException {}
12.
13. public Base() throws Exception {}
14. public Base(int i) throws Exception {}
15. //public Base(float f) throws ExtException{} //Error No.5: every other constructor will call the default constructor; same as Error No.4
16.}
17.
18.interface Inf
19.{
20. public void func2() throws ExtException;
21. //public void func3() throws AnotherException; //Error No.3: base and interface conflicts
22.
23. public void func4() throws Exception;
24. public void func5() throws Exception;
25.}
26.
27.class ExtImp extends Base implements Inf
28.{
29. //public void func() throws ExtException{} //Error No.1: if base function has no exception declaration, overriding CANNOT add one
30.
31. //public void func2() throws Exception {} //Error No.2: cannot implement interface; base and interface conflicts
32. public void func2() throws ExtException {} //implement interface and use Hint No.2
33.
34. //public void func3() throws ExtException {} //Error No.3
35. //public void func3() throws AnotherException {} //Error No.3
36.
37. public void func4() {} //Hint No.1: if base function has exception declaration, overriding CAN ommit
38. public void func5() throws ExtException {} //Hint No.2: if base function has exception declaration, overriding CAN declare ext exception
39.
40. //public ExtImp() {} //Error No.4: ext's construcor must declare the exception the base constructor declare
41. public ExtImp() throws Exception {}
42. //public ExtImp() throws ExtException {} //Error No.4
43.
44. public ExtImp(int i) throws Exception, ExtException {} //Hint No.3: once ext decalres throwing the base's exception, it CAN declare other exception (不一定非要是父类声明异常的子类), see Example2.java
45.
46. //public ExtImp(float f) throws ExtException{} //Error No.5
47.}
//@file Example1.java
class ExtException extends Exception {}
class AnotherException extends Exception {}
class Base
{
public void func() {}
public void func2() throws Exception {}
public void func3() throws ExtException {}
public Base() throws Exception {}
public Base(int i) throws Exception {}
//public Base(float f) throws ExtException{} //Error No.5: every other constructor will call the default constructor; same as Error No.4
}
interface Inf
{
public void func2() throws ExtException;
//public void func3() throws AnotherException; //Error No.3: base and interface conflicts
public void func4() throws Exception;
public void func5() throws Exception;
}
class ExtImp extends Base implements Inf
{
//public void func() throws ExtException{} //Error No.1: if base function has no exception declaration, overriding CANNOT add one
//public void func2() throws Exception {} //Error No.2: cannot implement interface; base and interface conflicts
public void func2() throws ExtException {} //implement interface and use Hint No.2
//public void func3() throws ExtException {} //Error No.3
//public void func3() throws AnotherException {} //Error No.3
public void func4() {} //Hint No.1: if base function has exception declaration, overriding CAN ommit
public void func5() throws ExtException {} //Hint No.2: if base function has exception declaration, overriding CAN declare ext exception
//public ExtImp() {} //Error No.4: ext's construcor must declare the exception the base constructor declare
public ExtImp() throws Exception {}
//public ExtImp() throws ExtException {} //Error No.4
public ExtImp(int i) throws Exception, ExtException {} //Hint No.3: once ext decalres throwing the base's exception, it CAN declare other exception (不一定非要是父类声明异常的子类), see Example2.java
//public ExtImp(float f) throws ExtException{} //Error No.5
}
Java代码
1.//@file Example2.java
2.
3.class ExtException extends Exception {}
4.class AnotherException extends Exception {}
5.class ThirdException extends Exception {}
6.class FourthException extends ThirdException {}
7.
8.class Base
9.{
10. public Base() {}
11. public Base(int i) throws ExtException {}
12. public Base(float f) throws ExtException {}
13.
14. public void func() throws ThirdException { System.out.println("Base.func()");}
15.}
16.
17.class Ext extends Base
18.{
19. public Ext() throws Exception {} //Hint No.4: ext's constructor CAN add exception declaration
20. public Ext(int i) throws ExtException, AnotherException {} //Hint No.4
21. public Ext(float f) throws Exception {} //Hint No.5: ext's constructor can declare base exception
22.
23. public void func() throws FourthException { System.out.println("Ext.func()");}
24.}
25.
26.public class Example2
27.{
28. public static void main(String[] args)
29. {
30. try
31. {
32. Ext e = new Ext(5);
33. e.func();
34. }
35. catch (ExtException ee) {}
36. catch (AnotherException ae) {}
37. catch (FourthException fe) {} // ***DIFFERENCE***
38.
39. try
40. {
41. Base b = new Ext(5);
42. b.func();
43. }
44. catch (ExtException ee) {}
45. catch (AnotherException ae) {}
46. catch (ThirdException te) {} // ***DIFFERENCE***
47. }
48.}
49.
50.//output:
51./*
52. Ext.func()
53. Ext.func()
54.*/
//@file Example2.java
class ExtException extends Exception {}
class AnotherException extends Exception {}
class ThirdException extends Exception {}
class FourthException extends ThirdException {}
class Base
{
public Base() {}
public Base(int i) throws ExtException {}
public Base(float f) throws ExtException {}
public void func() throws ThirdException { System.out.println("Base.func()");}
}
class Ext extends Base
{
public Ext() throws Exception {} //Hint No.4: ext's constructor CAN add exception declaration
public Ext(int i) throws ExtException, AnotherException {} //Hint No.4
public Ext(float f) throws Exception {} //Hint No.5: ext's constructor can declare base exception
public void func() throws FourthException { System.out.println("Ext.func()");}
}
public class Example2
{
public static void main(String[] args)
{
try
{
Ext e = new Ext(5);
e.func();
}
catch (ExtException ee) {}
catch (AnotherException ae) {}
catch (FourthException fe) {} // ***DIFFERENCE***
try
{
Base b = new Ext(5);
b.func();
}
catch (ExtException ee) {}
catch (AnotherException ae) {}
catch (ThirdException te) {} // ***DIFFERENCE***
}
}
//output:
/*
Ext.func()
Ext.func()
*/
针对覆写方法,有以下几点原则:
1. 如果基类方法没有声明异常,那么导出类的覆写方法也不能声明异常(Error No.1)。
2. 如果基类方法有声明异常,那么导出类的覆写方法可以:(1)不声明异常;(2)声明抛出基类方法的异常;(3)声明抛出基类方法异常的导出类。(Hint No.1 & Hint No.2)
3. 如果基类和接口有同签名方法,且导出类实现了接口,如果基类方法和接口方法声明的异常不同,则称基类与接口冲突。如果基类方法抛出的异常和接口方法声明的异常存在继承关系,则实现接口的导出类必须声明抛出导出异常(子异常)(Error No.2);如果如果基类方法声明的异常和接口方法声明的异常不存在继承关系,则冲突不可调和,需要修改基类或是接口(Error No.3)。
4. 由Example2.java可见,对于向上转型Base b = new Ext(5),调用b.func()虽然会动态绑定调用Ext的func()方法,可是异常捕捉必须按照Base的func()方法的异常声明来捕捉(见DIFFERENCE处)。
针对构造器的重写,有以下几点原则:
1. 这里应该持这么一种观点,基类的带参构造器和导出类的所有构造器都默认调用了基类的默认构造器,Base(int i)调用了Base(),Ext()调用了super(),Ext(int i)调用了super(i),依次类推。所以一旦基类的默认构造器声明了异常,那么基类的带参构造器和导出类的所有构造器都必须声明异常,异常类型可以是基类默认构造器的异常或是其基类,而决不能是其导出类(Error No.4, Error No.5 & Hint No.5)。
p.s. 导出类构造器虽然不能声明导出异常,不过可以抛出导出异常,如:
Java代码
1.class Base
2.{
3. public Base() throws NullPointerException {}
4.}
5.
6.class Ext extends Base
7.{
8. public Ext() throws Exception
9. {
10. throw new NullPointerException();
11. }
12.}
class Base
{
public Base() throws NullPointerException {}
}
class Ext extends Base
{
public Ext() throws Exception
{
throw new NullPointerException();
}
}所以牢记:声明异常和实际抛出异常完全是两码事。
2. 如1.所说,构造器的重写实际是调用关系,所以一旦默认构造器没有声明异常,那么其他构造器就可以随便添加异常声明(Hint No.3 & Hint No.4)。
Java代码
1.//@file Example1.java
2.
3.class ExtException extends Exception {}
4.class AnotherException extends Exception {}
5.
6.class Base
7.{
8. public void func() {}
9.
10. public void func2() throws Exception {}
11. public void func3() throws ExtException {}
12.
13. public Base() throws Exception {}
14. public Base(int i) throws Exception {}
15. //public Base(float f) throws ExtException{} //Error No.5: every other constructor will call the default constructor; same as Error No.4
16.}
17.
18.interface Inf
19.{
20. public void func2() throws ExtException;
21. //public void func3() throws AnotherException; //Error No.3: base and interface conflicts
22.
23. public void func4() throws Exception;
24. public void func5() throws Exception;
25.}
26.
27.class ExtImp extends Base implements Inf
28.{
29. //public void func() throws ExtException{} //Error No.1: if base function has no exception declaration, overriding CANNOT add one
30.
31. //public void func2() throws Exception {} //Error No.2: cannot implement interface; base and interface conflicts
32. public void func2() throws ExtException {} //implement interface and use Hint No.2
33.
34. //public void func3() throws ExtException {} //Error No.3
35. //public void func3() throws AnotherException {} //Error No.3
36.
37. public void func4() {} //Hint No.1: if base function has exception declaration, overriding CAN ommit
38. public void func5() throws ExtException {} //Hint No.2: if base function has exception declaration, overriding CAN declare ext exception
39.
40. //public ExtImp() {} //Error No.4: ext's construcor must declare the exception the base constructor declare
41. public ExtImp() throws Exception {}
42. //public ExtImp() throws ExtException {} //Error No.4
43.
44. public ExtImp(int i) throws Exception, ExtException {} //Hint No.3: once ext decalres throwing the base's exception, it CAN declare other exception (不一定非要是父类声明异常的子类), see Example2.java
45.
46. //public ExtImp(float f) throws ExtException{} //Error No.5
47.}
//@file Example1.java
class ExtException extends Exception {}
class AnotherException extends Exception {}
class Base
{
public void func() {}
public void func2() throws Exception {}
public void func3() throws ExtException {}
public Base() throws Exception {}
public Base(int i) throws Exception {}
//public Base(float f) throws ExtException{} //Error No.5: every other constructor will call the default constructor; same as Error No.4
}
interface Inf
{
public void func2() throws ExtException;
//public void func3() throws AnotherException; //Error No.3: base and interface conflicts
public void func4() throws Exception;
public void func5() throws Exception;
}
class ExtImp extends Base implements Inf
{
//public void func() throws ExtException{} //Error No.1: if base function has no exception declaration, overriding CANNOT add one
//public void func2() throws Exception {} //Error No.2: cannot implement interface; base and interface conflicts
public void func2() throws ExtException {} //implement interface and use Hint No.2
//public void func3() throws ExtException {} //Error No.3
//public void func3() throws AnotherException {} //Error No.3
public void func4() {} //Hint No.1: if base function has exception declaration, overriding CAN ommit
public void func5() throws ExtException {} //Hint No.2: if base function has exception declaration, overriding CAN declare ext exception
//public ExtImp() {} //Error No.4: ext's construcor must declare the exception the base constructor declare
public ExtImp() throws Exception {}
//public ExtImp() throws ExtException {} //Error No.4
public ExtImp(int i) throws Exception, ExtException {} //Hint No.3: once ext decalres throwing the base's exception, it CAN declare other exception (不一定非要是父类声明异常的子类), see Example2.java
//public ExtImp(float f) throws ExtException{} //Error No.5
}
Java代码
1.//@file Example2.java
2.
3.class ExtException extends Exception {}
4.class AnotherException extends Exception {}
5.class ThirdException extends Exception {}
6.class FourthException extends ThirdException {}
7.
8.class Base
9.{
10. public Base() {}
11. public Base(int i) throws ExtException {}
12. public Base(float f) throws ExtException {}
13.
14. public void func() throws ThirdException { System.out.println("Base.func()");}
15.}
16.
17.class Ext extends Base
18.{
19. public Ext() throws Exception {} //Hint No.4: ext's constructor CAN add exception declaration
20. public Ext(int i) throws ExtException, AnotherException {} //Hint No.4
21. public Ext(float f) throws Exception {} //Hint No.5: ext's constructor can declare base exception
22.
23. public void func() throws FourthException { System.out.println("Ext.func()");}
24.}
25.
26.public class Example2
27.{
28. public static void main(String[] args)
29. {
30. try
31. {
32. Ext e = new Ext(5);
33. e.func();
34. }
35. catch (ExtException ee) {}
36. catch (AnotherException ae) {}
37. catch (FourthException fe) {} // ***DIFFERENCE***
38.
39. try
40. {
41. Base b = new Ext(5);
42. b.func();
43. }
44. catch (ExtException ee) {}
45. catch (AnotherException ae) {}
46. catch (ThirdException te) {} // ***DIFFERENCE***
47. }
48.}
49.
50.//output:
51./*
52. Ext.func()
53. Ext.func()
54.*/
//@file Example2.java
class ExtException extends Exception {}
class AnotherException extends Exception {}
class ThirdException extends Exception {}
class FourthException extends ThirdException {}
class Base
{
public Base() {}
public Base(int i) throws ExtException {}
public Base(float f) throws ExtException {}
public void func() throws ThirdException { System.out.println("Base.func()");}
}
class Ext extends Base
{
public Ext() throws Exception {} //Hint No.4: ext's constructor CAN add exception declaration
public Ext(int i) throws ExtException, AnotherException {} //Hint No.4
public Ext(float f) throws Exception {} //Hint No.5: ext's constructor can declare base exception
public void func() throws FourthException { System.out.println("Ext.func()");}
}
public class Example2
{
public static void main(String[] args)
{
try
{
Ext e = new Ext(5);
e.func();
}
catch (ExtException ee) {}
catch (AnotherException ae) {}
catch (FourthException fe) {} // ***DIFFERENCE***
try
{
Base b = new Ext(5);
b.func();
}
catch (ExtException ee) {}
catch (AnotherException ae) {}
catch (ThirdException te) {} // ***DIFFERENCE***
}
}
//output:
/*
Ext.func()
Ext.func()
*/
针对覆写方法,有以下几点原则:
1. 如果基类方法没有声明异常,那么导出类的覆写方法也不能声明异常(Error No.1)。
2. 如果基类方法有声明异常,那么导出类的覆写方法可以:(1)不声明异常;(2)声明抛出基类方法的异常;(3)声明抛出基类方法异常的导出类。(Hint No.1 & Hint No.2)
3. 如果基类和接口有同签名方法,且导出类实现了接口,如果基类方法和接口方法声明的异常不同,则称基类与接口冲突。如果基类方法抛出的异常和接口方法声明的异常存在继承关系,则实现接口的导出类必须声明抛出导出异常(子异常)(Error No.2);如果如果基类方法声明的异常和接口方法声明的异常不存在继承关系,则冲突不可调和,需要修改基类或是接口(Error No.3)。
4. 由Example2.java可见,对于向上转型Base b = new Ext(5),调用b.func()虽然会动态绑定调用Ext的func()方法,可是异常捕捉必须按照Base的func()方法的异常声明来捕捉(见DIFFERENCE处)。
针对构造器的重写,有以下几点原则:
1. 这里应该持这么一种观点,基类的带参构造器和导出类的所有构造器都默认调用了基类的默认构造器,Base(int i)调用了Base(),Ext()调用了super(),Ext(int i)调用了super(i),依次类推。所以一旦基类的默认构造器声明了异常,那么基类的带参构造器和导出类的所有构造器都必须声明异常,异常类型可以是基类默认构造器的异常或是其基类,而决不能是其导出类(Error No.4, Error No.5 & Hint No.5)。
p.s. 导出类构造器虽然不能声明导出异常,不过可以抛出导出异常,如:
Java代码
1.class Base
2.{
3. public Base() throws NullPointerException {}
4.}
5.
6.class Ext extends Base
7.{
8. public Ext() throws Exception
9. {
10. throw new NullPointerException();
11. }
12.}
class Base
{
public Base() throws NullPointerException {}
}
class Ext extends Base
{
public Ext() throws Exception
{
throw new NullPointerException();
}
}所以牢记:声明异常和实际抛出异常完全是两码事。
2. 如1.所说,构造器的重写实际是调用关系,所以一旦默认构造器没有声明异常,那么其他构造器就可以随便添加异常声明(Hint No.3 & Hint No.4)。
相关推荐
确保在服务接口中声明该异常,以便消费者知道可能会捕获到哪些异常: ```java public interface MyService { void doSomething() throws CustomServiceException; } ``` 3. **服务消费者捕获异常** 在服务...
全局异常捕获通常涉及到创建一个全局的错误处理器,它能在应用程序的任何地方捕获并处理异常,防止程序崩溃。这种机制对于调试、日志记录和用户反馈都有着积极的作用。下面将详细介绍如何在Android中实现全局异常...
Java允许创建自定义异常类,继承自java.lang.Throwable或其子类,如Exception。当需要表示特定业务逻辑错误时,自定义异常就很有用。 总结起来,Java异常处理是通过try-catch-finally结构来实现的,它使得程序能够...
从给定的文件信息来看,该段代码及注释主要涉及了Java中的异常处理机制以及如何自定义异常。下面将详细解析与“java笔记 异常 多线程”相关的知识点,包括异常处理的基本概念、如何捕捉和抛出异常、自定义异常的创建...
在C#中实现屏幕捕捉通常涉及到对Windows API的调用,或者利用.NET Framework提供的类库,如GDI+(Graphics Device Interface Plus)。 ### 分析代码片段 在给定的代码片段中,我们可以看到一个简单的Windows Forms...
### JAVA自定义异常类 #### 一、基本概念与应用场景 在Java编程中,异常处理是一种重要的机制,用于处理程序运行时可能...自定义异常类可以更加精确地捕捉和处理特定的错误情况,有助于提高程序的健壮性和可读性。
例如,如果一个方法可能抛出异常,它需要在其声明中使用`throws`关键字列出可能抛出的异常类型,或者在方法体中显式地使用`throw`语句抛出异常。 异常处理不仅在方法内部进行,也可以沿着方法调用链向上回溯,直到...
在Flex开发中,类型转换是一个非常重要的概念,它涉及到如何将一个类型的对象转换为另一个类型的对象。特别是在ActionScript 3(AS3)中,强制类型转换是实现某些功能的关键手段之一。本文将详细介绍FLEX中的强制...
第八题“在方法定义中,所以可能发生的异常都必须用try{} catch(){}捕捉。”不正确,不是所有异常都需要捕获,有些异常可以由系统自动处理。第九题“Java 支持多重继承。”这是错误的,Java不支持多重类继承,但可以...
- **Exception**: 表示需要捕捉或处理的异常,通常是程序可以处理的情况。 #### 7. 类声明为final的意义 在Java中,如果一个类被声明为`final`,这意味着该类不能被继承,即它是顶级类,不能作为其他类的父类。 #...
在JAVA中,所有异常都继承自`java.lang.Throwable`类,其中包括`Exception`和`Error`两个主要子类。`Exception`进一步细分为`RuntimeException`和其他检查型异常,如`IOException`、`SQLException`等。`...
综上所述,这份文档内容涵盖了.NET框架以及C#编程语言的多个方面,涉及了基础语法、数据类型、面向对象编程、异常处理、数据访问和Web开发等多个知识点。通过这些题目,可以加深对.NET基础概念的理解和应用。由于...
在这个代码中,我们可以看到Java的基本语法结构,如变量声明、方法定义、类继承等。 2. Java图形用户界面(GUI) 在这个代码中,我们可以看到使用了Java的图形用户界面(GUI)组件,例如JFrame、JPanel、JButton、...
本书不仅覆盖了C++的基础语法,还涉及到了面向对象编程、模板、异常处理、标准模板库(STL)等高级主题,为读者提供了全面的C++知识体系。 ### C++基础语法 C++是一种静态类型的、编译式的、通用的、大小写敏感的、...
以上是Java期末复习题中涉及的知识点解析,包括语言特性、类声明、循环控制、异常处理、I/O流、事件处理、Applet、GUI组件、布局管理器、多线程通信、类的继承、包管理和文件操作等。掌握这些知识点对通过Java考试至...
7. **异常处理**:Java通过try-catch-finally语句块进行异常处理,实例会教你如何捕捉和处理运行时错误,提高程序的健壮性。 8. **集合框架**:Java集合框架包括List、Set、Map等接口及其实现类,如ArrayList、...
可以通过继承Exception或其子类来创建自定义异常类。 **抛出你自己的异常:** 可以使用throw关键字来抛出自定义异常。 #### 九、图形用户接口 Java提供了Swing和JavaFX等库来创建图形用户界面(GUI)。 #### 十...
- D选项是正确的,checked异常(编译时需要处理的异常)必须捕捉或声明抛出,而unchecked异常(运行时异常)可以选择忽略。 14. **JDBC超时机制**: - JDBC调用数据库的超时机制涉及到Driver Socket Timeout、...
- 下午,介绍异常处理,理解异常的概念,如何捕获异常,全捕捉和自定义异常。课后练习是一个交互式程序,让用户输入数值求和,遇到非数值时给出提示,直到用户输入quit为止。 **第6天:正则表达式与多线程** - 上午...
6. **字符串与异常处理**:day16可能涉及到String类的常用操作,如拼接、查找、替换等,以及异常处理机制(try-catch-finally),如何捕捉和处理运行时错误。 7. **集合框架**:day14可能涵盖ArrayList、LinkedList...