问题1:Thinking In Java第四版书关于异常章节的例子中,作者会以两种方式来写自定义的异常如下:
1、Public class Test extends Exception{}
2、Public class Test extends Exception{
  public Test(String s){super(s);}
}
可我觉得这两种写法没啥区别的,为什么他要这样交替的去写呢?
问题2:自己写了一段关于异常继承方面的代码,只有一个小问题,请看代码。
class aa extends Exception{}
class bb extends aa{}
class cc extends Exception{}
class dd extends Exception{}class Test1{
public Test1()throws aa,cc{}
public void f()throws aa{
System.out.println("Test1.f()");
throw new aa();
}
}interface Test2{
void f()throws dd;
}public class Test extends Test1 implements Test2{
public Test()throws aa,cc,dd{}
public void f()/*throws bb*/{   //这个方法既是Test1中的又是Test2接口中的,可是我想在Test中再加入一个
//异常的话怎么办?我写过 public void f()throws aa,dd,bb{ 这样也不行。 
System.out.println("Test.f()");
//throw new bb();
}
public static void main(String[] args){
try{
Test test = new Test();
test.f();
}
catch(aa a){
a.printStackTrace(System.out);
}
/*catch(bb b){
System.out.println("catch bb");
}*/
catch(cc c){
System.out.println("catch cc");
}
catch(dd d){
System.out.println("catch dd");
}
}
}

解决方案 »

  1.   

    Public class Test extends Exception{} 
    这种的话,编译器创建了默认构造器,它将自动
    调用基类的默认构造器。并没有在这个类里显示写上
    Test(String message,String key){}这样的构造方法。一般在自定义异常类时,都会写各种构造方法(参数不同),
    适应各种异常情况。
    你想在Test类的f()方法中抛出bb异常,可以这样来做。
    由于f()方法既是Test1中的又是Test2接口中的,所以必须考虑交集
    就是必须在Test1类中f()方法声明会抛出bb异常,同时你还得在接口Test2中的f()方法
    后面声明会抛出bb异常。
    这样的话,作为它们子类的Test类中的f()方法才可以抛出bb异常。当子类覆盖父类中的方法时,子类的方法不可以比父类的方法抛出更多的异常,原因是多态,
    父类引用会指向子类对象,如果子类方法(已经覆盖了父类的方法)抛出了
    比父类更多的异常,父类是察觉不到的,它知道自己的方法会抛出什么异常。
      

  2.   

    实现接口中的方法,自定义异常抛出,接口的方法应该也要throws吧,要不就不叫实现接口中的那个方法了。