哪位大侠帮我看看这到笔试题,Exception的,题目很有意思,可惜刚来,分不多

wjjdlove 2008-01-27 03:53:50
public class throwExpTest {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(fun1(4));
System.out.println(fun1(3));
System.out.println(fun1(2));
System.out.println(fun1(1));
System.out.println(fun1(0));
System.out.println(fun1(-1));
System.out.println(fun1(-2));
System.out.println(fun1(-3));
System.out.println(fun1(-4));
}
public static int fun1(int i)
{
try{
return ((Exp1)(fun0(i))).mul(5);
}catch(Exp2 e){ return e.add(i);}
catch(Exp3 e){return e.add(i); }
catch(Exception e){return -2;}
//return -1;
}
public static Exception fun0(int i)throws Exception{
Exception e[]={null,new Exp1(),new Exp2(),new Exp3()};
if(i>0)throw e[i];
else if(i<0){e[0]=e[-i];}
return e[0];
}
}
class Exp1 extends Exception{
int add(int i){return i+2;}
int mul(int i){return i*2;}
}
class Exp2 extends Exp1{
int add(int i){return i+3;}
int mul(int i){return i*3;}
}
class Exp3 extends Exp1{
int add(int i){return i+4;}
int mul(int i){return i*4;}
}
...全文
63 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjjdlove 2008-01-27
  • 打赏
  • 举报
回复
是没搞清楚throw Exception和return Exception的区别
老紫竹 2008-01-27
  • 打赏
  • 举报
回复
还有,所有的强制转换只影响其调用的方法名称
虽然你转化为Exp1, 但调用 mul方法时,执行的依然是
e[0]=e[-i];
传过来的 Exp2,3
老紫竹 2008-01-27
  • 打赏
  • 举报
回复
等待啥啊。。。 看这一句
e[0]=e[-i];
这一句已经把子类传递过来了,也就是你所的男人传过来了
return e[0] 返回去的虽然看上去是人,但其本质是男人哦!
wjjdlove 2008-01-27
  • 打赏
  • 举报
回复
继续等待。。。
wjjdlove 2008-01-27
  • 打赏
  • 举报
回复
class 人{
int sum;
}
class 男人 extends 人{
double sum;
public static void main(String args[]){
人 a=new 人();
男人 b=new 男人();
b=(男人)a;
}
}


你能把“人”强制转换成“男人”吗??很显然不能

所谓“父类向子类转换是强制转换”是指这种情况
A a=new B();
B b=(B)a;

此时a实际上是一个B的实例,但被定义为A,这样就无法调用B中定义的方法,只有在强制转换为B的实例后才能调用B中定义的方法——前提是:a是B的实例

如果是
A a=new A();
B b=new B();
b=(A)a;
a本身是A的实例,不具有B的特征,不可能转换为B的实例。
这就像你不能
Object obj=new Object();
String str = (String)obj;


return ((Exp1)(fun0(i))).mul(5); 这句是先强制转换,再取mul值的
wjjdlove 2008-01-27
  • 打赏
  • 举报
回复
紫竹果然是高人

就是对Ext1,Ext2,Ext3间的强制转换不太明白

wjjdlove 2008-01-27
  • 打赏
  • 举报
回复
第一次捕获异常的时候可以捕获到Ext2,Ext3

第二次fun1(i)的参数是负数的时候,异常应该同样被强制转换成Ext2,Ext3
为什么不能直接从
catch(Exp2 e){ return e.add(i);}
catch(Exp3 e){return e.add(i); }
catch(Exception e){return -2;}
//return -1;
中得到,而是在try中捕获呢?
老紫竹 2008-01-27
  • 打赏
  • 举报
回复
让我们看什么?有什么问题?
-2 因为e[] 数组越届
7 Ext3的+4
5 Ext2的+3
-2 没有捕获Ext1,转Exception
-2 空指针
10 e[1]->e[0], Ext1*2
15 e[2]->e[0],Ext2*3
20 e[3]->e[0],Ext3*4
-2 e[4] 不存在,越界

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧