问题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{}
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");
}
}
}
解决方案 »
- 打完jar包之后,在源码里设置的@Retention(RetentionPolicy.RUNTIME)注释不起作用了
- 这道java基础题,哪位高手能够指点下,谢谢
- 为什么PrintStream(OutputStream os).println()可以自动刷新
- 帮我解释一下g.drawRect(0, 0, getSize().width - 1,getSize().height - 1);中getSize()为什么就可以直接用?
- 关于一个六合彩的程序问题?
- 在applet中如何使用keypress事件.
- 请各位帮我指明方向
- 用Java如何读取flash的长宽
- 谁知道哪里有 http://www.gm365.com/Login?id=xiaxin&pass=123456 这种Java游戏的源码下载?
- 各位大侠快帮助小弟一下吧!
- 急,断电后lomboz eclipse里打开文件出错.
- 有一个swing的画图问题问问大家
这种的话,编译器创建了默认构造器,它将自动
调用基类的默认构造器。并没有在这个类里显示写上
Test(String message,String key){}这样的构造方法。一般在自定义异常类时,都会写各种构造方法(参数不同),
适应各种异常情况。
你想在Test类的f()方法中抛出bb异常,可以这样来做。
由于f()方法既是Test1中的又是Test2接口中的,所以必须考虑交集,
就是必须在Test1类中f()方法声明会抛出bb异常,同时你还得在接口Test2中的f()方法
后面声明会抛出bb异常。
这样的话,作为它们子类的Test类中的f()方法才可以抛出bb异常。当子类覆盖父类中的方法时,子类的方法不可以比父类的方法抛出更多的异常,原因是多态,
父类引用会指向子类对象,如果子类方法(已经覆盖了父类的方法)抛出了
比父类更多的异常,父类是察觉不到的,它知道自己的方法会抛出什么异常。