java 的异常有几种类型 ?? 如题 , 今天去面试 ,面试官问我这个问题 。 当时没答上, 哪个朋友告诉一下答案 ,哈哈 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 此回复为自动发出,仅用于显示而已,并无任何其他特殊作用楼主【jaksuse】截止到2008-07-23 11:56:25的历史汇总数据(不包括此帖):发帖的总数量:4 发帖的总分数:62 每贴平均分数:15 回帖的总数量:68 得分贴总数量:22 回帖的得分率:32% 结贴的总数量:4 结贴的总分数:62 无满意结贴数:0 无满意结贴分:0 未结的帖子数:0 未结的总分数:0 结贴的百分比:100.00% 结分的百分比:100.00% 无满意结贴率:0.00 % 无满意结分率:0.00 % 敬礼! 未检查异常和已检查异常所有派生自Error和RuntimeException的类,都是未检查异常.其余的是已检查异常.未检查异常意思就是说,编译器不会检查程序是否抛出异常,换句话说,程序员可以不用使用try-catch来捕获异常,比如NullPointerException 按基类到子类从上到下的顺序是 Throwable | | Error Exception (这2个被检查的异常) | RuntimeException(未被检查的异常) Throwable接口是JVM用来判断是不是可以throw。Error是Throwable的一个子类,这个类以及其子类不需要java程序强制catch,当然你也可以catch,或者说有时候最好catch。Error的意思是java虚拟机内部出现了问题,而不是某个code block有问题,比如说,OutOfMemoryError是没有内存了,LinkageError是class文件不合法之类的。这些东西开始学java可以先不必理会。等学到一定level再慢慢理解更好。Exception就是我们平时编程的时候打交道的异常的父类。它实现了Throwable。Exception分两种,一种是编译期异常,一种是运行期异常(RuntimeException的子类),编译期异常就是客观上可以通过java编译期可以检测出的并且需要coder处理的异常,比如IOException,只要有IO操作(比如读取文件或者操作Socket)就有可能会有IOException,所以java把IOException定为编译期异常。编译期异常要求coder必须catch或者throw。运行期异常就是在编译期间无法确定的异常,所以不需要coder处理。比如NumberFormatException,NullPointException等等,只有在真正程序运行起来才知道会不会有错误,编译期是不可能知道的,有些运行期异常最好也catch,比如NumberFormatException,catch了以后可以复个default value,比如0 或者 -1,否则程序可能就走不下去了。至于java为什么把一个异常定为运行期异常或者编译期异常,我想还是Sun的工程师根据自己经验或者惯例来的吧。比如NumberFormatException,这个也完全可以是编译期异常,只要有字符转数字的地方都有可能发生此异常。但如果这样,我们的code里面可能就充斥着很多很多的try-cacth block了,如果NullPointException定为编译期异常,那整个java就没有一行code不在try-catch block里面了 :)。 当然如果是应付面试,你可以说java就两种异常,一种是编译期异常,需要coder自己编程处理:catch住或者throw出去,一种是运行期异常,不需要编程处理,但是为了程序的容错性,也可以catch住处理或者throw。 已经说的很好了,补充一下未检查异常和已检查异常的最大区别在于:如果发生了未检查异常,就说明是程序员的问题了,也就是说一个完美的程序员编出来的程序是不可能抛出未检查异常的,抛出的话,说明程序编的还不够健壮。比如NullPointerException这个未检查异常,如果抛出的话,必然是没有先判断变量是否等于nullif(user!=null){ user.save();}而已检查异常如IOException,程序员如果想要一辈子不让程序抛出它是不可能的,因为没法控制网络的链接一直保持有效,你可以把网线做的很坚固,但是人家电信那出故障了,一样还是要抛出这个异常。所以已检查异常是不可控的,所以在程序中一定要对他try/catch或throws到上层调用方法而未检查异常是可控的,只要你有足够的经验,可以让他一辈子不被抛出 谢谢朋友们的回答 。 thank you ! JAVA 内部类是否可以相互引用? 用xfire调用webserver时报null,求解!! 我的一个JSP系统在重装环境后无法显示,请高手帮忙 数组填充问题 数组是否包含一元素 ~~~请教高手~~~ SOS:超高分相赠,请教两个紧迫的jBuilder使用问题! 新手提问:怎样开发Java的b/s模式的系统? 我用Java作了一个离线浏览器(像Offline explore).... 在静态上下文中不能引用非静态方法test(),天啊,为什么我的main()不能调用任何其它函数? 新手的 问题!~ 怎么让drawLine()的极坐标变成contentPane的极坐标?
楼主【jaksuse】截止到2008-07-23 11:56:25的历史汇总数据(不包括此帖):
发帖的总数量:4 发帖的总分数:62 每贴平均分数:15
回帖的总数量:68 得分贴总数量:22 回帖的得分率:32%
结贴的总数量:4 结贴的总分数:62
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:0.00 % 无满意结分率:0.00 %
敬礼!
Throwable
| |
Error Exception (这2个被检查的异常)
|
RuntimeException(未被检查的异常)
Error是Throwable的一个子类,这个类以及其子类不需要java程序强制catch,当然你也可以catch,或者说有时候最好catch。Error的意思是java虚拟机内部出现了问题,而不是某个code block有问题,比如说,OutOfMemoryError是没有内存了,LinkageError是class文件不合法之类的。这些东西开始学java可以先不必理会。等学到一定level再慢慢理解更好。Exception就是我们平时编程的时候打交道的异常的父类。它实现了Throwable。Exception分两种,一种是编译期异常,一种是运行期异常(RuntimeException的子类),编译期异常就是客观上可以通过java编译期可以检测出的并且需要coder处理的异常,比如IOException,只要有IO操作(比如读取文件或者操作Socket)就有可能会有IOException,所以java把IOException定为编译期异常。编译期异常要求coder必须catch或者throw。运行期异常就是在编译期间无法确定的异常,所以不需要coder处理。比如NumberFormatException,NullPointException等等,只有在真正程序运行起来才知道会不会有错误,编译期是不可能知道的,有些运行期异常最好也catch,比如NumberFormatException,catch了以后可以复个default value,比如0 或者 -1,否则程序可能就走不下去了。至于java为什么把一个异常定为运行期异常或者编译期异常,我想还是Sun的工程师根据自己经验或者惯例来的吧。比如NumberFormatException,这个也完全可以是编译期异常,只要有字符转数字的地方都有可能发生此异常。但如果这样,我们的code里面可能就充斥着很多很多的try-cacth block了,如果NullPointException定为编译期异常,那整个java就没有一行code不在try-catch block里面了 :)。
补充一下未检查异常和已检查异常的最大区别在于:
如果发生了未检查异常,就说明是程序员的问题了,也就是说一个完美的程序员编出来的程序是不可能抛出未检查异常的,抛出的话,说明程序编的
还不够健壮。
比如NullPointerException这个未检查异常,如果抛出的话,必然是没有先判断变量是否等于null
if(user!=null){
user.save();
}而已检查异常如IOException,程序员如果想要一辈子不让程序抛出它是不可能的,因为没法控制网络的链接一直保持有效,你可以把网线做的很坚固,但是人家电信那出故障了,一样还是要抛出这个异常。所以已检查异常是不可控的,所以在程序中一定要对他try/catch或throws到上层调用方法
而未检查异常是可控的,只要你有足够的经验,可以让他一辈子不被抛出