几个QQ群都不能解释的问题:自定义Exception的子类(子类继承Exception类,并未作任何修改),却不能捕捉原来Excepton能捕捉的异常,为什么?

zengchunming 2012-08-06 10:30:45
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应该强人多的
...全文
487 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cactus_hxk 2012-08-09
  • 打赏
  • 举报
回复
看来你加的QQjava技术都不行啊!果断退出!
rorom 2012-08-09
  • 打赏
  • 举报
回复
抛什么异常就捕什么异常,就行了.当然你无论抛什么异常都可以捕获Exception,因为他是异常类的根
sky254541843 2012-08-09
  • 打赏
  • 举报
回复
报的是java.lang.ArithmeticException,而你catch捕获的是自定义的异常,肯定捕获不到
GeekQing 2012-08-09
  • 打赏
  • 举报
回复
首先你知道1/0会抛出什么异常么?ArithmeticException, 这个也是继承的Exception,你的test()方法只抛出了你的异常 MyException ,MyException不能包含 ArithmeticException,所以你捕获不到啊,你应该在test()方法里直接throw MyException(); 我想就能达到你想要的效果了。
hou553403977 2012-08-07
  • 打赏
  • 举报
回复
楼主没有抛出MyException异常
飞翔的猪头三 2012-08-07
  • 打赏
  • 举报
回复
try{

demo.test();

}catch( Exception e){
try{throw new MyException();}
catch(MyException mye){System.out.println("捕捉自定义异常成功");}
}
catch里面嵌套一个try,catch就OK了。
逅倁後覺 2012-08-07
  • 打赏
  • 举报
回复
throws 关键字是用来指定可能抛出的异常。
System.out.println(1/0); 你并没有处理发生异常时 抛出MyException
龙四 2012-08-07
  • 打赏
  • 举报
回复
知道LZ的意思了,1/0抛出的异常为:ArithmeticException

而你的MyException跟ArithmeticException没有一点儿关系,当test方法抛出ArithmeticException,它会去找有没有catch(ArithmeticException),有么可有catch(RuntimeException),有没有catch(Exception),有没有catch(Throwable),1/0只会进入这几个异常处理,不会进入LZ的catch(MyException)
sffx123 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

Exception 类是所有异常类的父类,可以捕获所有异常,你继承后的自定义异常类只可以捕获抛出你自定义的异常
[/Quote]程序抛出的异常是ArithmeticException异常继承自Exception,你自定义的异常只是继承Exception,但是它不是“父类”,也是“子类”,ArithmeticException跟你的自定义异常类没有半点关系,出异常了肯定不能被你的MyException捕获了,你自定义了异常出现问题得抛出你自己的异常,才能被捕获,默认的都是使用java自己的异常。开玩笑的说:路上有个人长得跟你爸一模一样,他就是你爹了?。
龙四 2012-08-07
  • 打赏
  • 举报
回复
我错了,原来可以编译

[Quote=引用 4 楼 的回复:]

System.out.println(1/0);这么写编译能通过吗?!我印象中似乎不能
[/Quote]
龙四 2012-08-07
  • 打赏
  • 举报
回复
System.out.println(1/0);这么写编译能通过吗?!我印象中似乎不能
  • 打赏
  • 举报
回复
Exception 类是所有异常类的父类,可以捕获所有异常,你继承后的自定义异常类只可以捕获抛出你自定义的异常
chenqipc 2012-08-07
  • 打赏
  • 举报
回复
当出现ArithmeticException异常时,catch 会先找有没有ArithmeticException,当没有catch这个异常,他回去找他的父类,而你自己定义的异常,并不是ArithmeticException异常的父类。
wonkju 2012-08-07
  • 打赏
  • 举报
回复
我觉得下来6楼说的对,顶
balabala_sean 2012-08-07
  • 打赏
  • 举报
回复
你的关键问题出在这里:

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自动匹配的异常信息。

希望你能看的明白。
balabala_sean 2012-08-07
  • 打赏
  • 举报
回复
代码修改如下:

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

}
}
Younfor 2012-08-07
  • 打赏
  • 举报
回复
public void test() throws MyException
{
try {
System.out.println(1/0);
} catch (RuntimeException e) {
// TODO Auto-generated catch block
throw (new MyException()) ;
}

}
wangdong20 2012-08-06
  • 打赏
  • 举报
回复
设断点调试下看看
sjlzcj 2012-08-06
  • 打赏
  • 举报
回复
异常都没抛出,捕获什么

62,616

社区成员

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

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