package com.demo;public class Demo1 { /**
 * @param args
 * @throws Exception 
 */
public static void main(String[] args) 
{
// TODO Auto-generated method stub
Demo demo=new Demo();
try{

demo.test();

}catch( MyException e){ //  只想知道这个地方,为什么MyException不能代替Exception
//  MyException是直接继承Exception类,并未作任何修改,却不能捕捉原来Excepton能捕捉的异常,为什么?

System.out.println("捕捉自定义异常成功");


}finally{
//demo.show();
}
}

}
class Demo 
{
int i=0;
public void test() throws MyException
{
System.out.println(1/0);

}
}//定义异常类
class MyException extends Exception
{
public MyException(){

super();

}
}补充: 
      只求高手给出原因,我只想知道原因,如果可以简单该,应该怎么改?要改动很多就算了!
   
     因为想知道  如代码中解释那行 所提出的问题的原因。    希望有人知道,CSDN应该强人多的

解决方案 »

  1.   

    Exception 类是所有异常类的父类,可以捕获所有异常,你继承后的自定义异常类只可以捕获抛出你自定义的异常
      

  2.   

    System.out.println(1/0);这么写编译能通过吗?!我印象中似乎不能
      

  3.   

    程序抛出的异常是ArithmeticException异常继承自Exception,你自定义的异常只是继承Exception,但是它不是“父类”,也是“子类”,ArithmeticException跟你的自定义异常类没有半点关系,出异常了肯定不能被你的MyException捕获了,你自定义了异常出现问题得抛出你自己的异常,才能被捕获,默认的都是使用java自己的异常。开玩笑的说:路上有个人长得跟你爸一模一样,他就是你爹了?。
      

  4.   

    知道LZ的意思了,1/0抛出的异常为:ArithmeticException而你的MyException跟ArithmeticException没有一点儿关系,当test方法抛出ArithmeticException,它会去找有没有catch(ArithmeticException),有么可有catch(RuntimeException),有没有catch(Exception),有没有catch(Throwable),1/0只会进入这几个异常处理,不会进入LZ的catch(MyException)
      

  5.   

    throws 关键字是用来指定可能抛出的异常。
    System.out.println(1/0); 你并没有处理发生异常时 抛出MyException
      

  6.   

    public void test() throws MyException
     {
     try {
    System.out.println(1/0);
    } catch (RuntimeException e) {
    // TODO Auto-generated catch block
    throw (new MyException()) ;
    } }
      

  7.   

    代码修改如下:public class Demo01 { /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Demo demo = new Demo();
    try{
    demo.test();
    }catch(MyException me){
    System.out.println(me.getMessage());
    System.out.println("捕捉自定义异常成功");
    }

    }}class Demo {
    int i = 0; public void test() throws MyException{
    try{
    System.out.println(1 / 0);
    }catch(Exception me){
    throw new MyException("出现了自定义异常");
    } }
    }// 定义异常类
    class MyException extends Exception {
    public MyException(String mesg) {
    super(mesg); }
    }
      

  8.   

    你的关键问题出在这里:class Demo {
    int i = 0; /*
    public void test() throws MyException{
    try{
    System.out.println(1 / 0);
    }catch(Exception me){
    throw new MyException("出现了自定义异常");
    }
    }
    */
    }
    你不明白throws的用法,在用throws的时候,在方法体之中,是一定明确的抛出了异常的,即你可以简单的理解为,方法体之中出现了throw,那么方法才会用throws来标识抛出的对应的异常。你自己写的test()方法:    public void test() throws MyException{
            System.out.println(1 / 0);
        }这里方法体之中并没有把System.out.println(1/0)的异常信息抛throw出去,所以你这里的throws如同虚设,只是个鸡肋。所以在执行main()方法的时候,demo.test()出现异常,就不再运行了。抛出的也是Java Virtual Machine自动匹配的异常信息。希望你能看的明白。
      

  9.   

    当出现ArithmeticException异常时,catch 会先找有没有ArithmeticException,当没有catch这个异常,他回去找他的父类,而你自己定义的异常,并不是ArithmeticException异常的父类。
      

  10.   

     try{ demo.test(); }catch( Exception e){  
      try{throw new MyException();} 
      catch(MyException mye){System.out.println("捕捉自定义异常成功");}
    }
    catch里面嵌套一个try,catch就OK了。
      

  11.   

    报的是java.lang.ArithmeticException,而你catch捕获的是自定义的异常,肯定捕获不到
      

  12.   

    抛什么异常就捕什么异常,就行了.当然你无论抛什么异常都可以捕获Exception,因为他是异常类的根
      

  13.   

    看来你加的QQjava技术都不行啊!果断退出!
      

  14.   

    首先你知道1/0会抛出什么异常么?ArithmeticException, 这个也是继承的Exception,你的test()方法只抛出了你的异常 MyException ,MyException不能包含 ArithmeticException,所以你捕获不到啊,你应该在test()方法里直接throw MyException(); 我想就能达到你想要的效果了。