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;}
}

解决方案 »

  1.   

    让我们看什么?有什么问题?
    -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] 不存在,越界
      

  2.   

    第一次捕获异常的时候可以捕获到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中捕获呢?
      

  3.   

    紫竹果然是高人就是对Ext1,Ext2,Ext3间的强制转换不太明白 
      

  4.   

    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值的
      

  5.   

    等待啥啊 看这一句
    e[0]=e[-i];
    这一句已经把子类传递过来了,也就是你所的男人传过来了
    return e[0] 返回去的虽然看上去是人,但其本质是男人哦!
      

  6.   

    还有,所有的强制转换只影响其调用的方法名称
    虽然你转化为Exp1, 但调用 mul方法时,执行的依然是
    e[0]=e[-i]; 
    传过来的 Exp2,3
      

  7.   

    是没搞清楚throw Exception和return Exception的区别