java 的异常有几种类型 ??

jaksuse 2008-07-23 11:56:20
如题 , 今天去面试 ,面试官问我这个问题 。 当时没答上, 哪个朋友告诉一下答案 ,哈哈
...全文
496 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jaksuse 2008-07-24
  • 打赏
  • 举报
回复
谢谢朋友们的回答 。 thank you !
n7kki1986 2008-07-23
  • 打赏
  • 举报
回复
按基类到子类从上到下的顺序是
Throwable
| |
Error Exception (这2个被检查的异常)
|
RuntimeException(未被检查的异常)
For_suzhen 2008-07-23
  • 打赏
  • 举报
回复
学习
墨水鱼 2008-07-23
  • 打赏
  • 举报
回复
2楼的是正确的
冰思雨 2008-07-23
  • 打赏
  • 举报
回复
未检查异常和已检查异常

所有派生自Error和RuntimeException的类,都是未检查异常.其余的是已检查异常.

未检查异常意思就是说,编译器不会检查程序是否抛出异常,换句话说,程序员可以不用使用try-catch来捕获异常,比如NullPointerException
xah1985 2008-07-23
  • 打赏
  • 举报
回复
学习了。。。。
zhouzhijun 2008-07-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 preferme 的回复:]
未检查异常和已检查异常

所有派生自Error和RuntimeException的类,都是未检查异常.其余的是已检查异常.

未检查异常意思就是说,编译器不会检查程序是否抛出异常,换句话说,程序员可以不用使用try-catch来捕获异常,比如NullPointerException
[/Quote]
已经说的很好了,
补充一下未检查异常和已检查异常的最大区别在于:
如果发生了未检查异常,就说明是程序员的问题了,也就是说一个完美的程序员编出来的程序是不可能抛出未检查异常的,抛出的话,说明程序编的
还不够健壮。
比如NullPointerException这个未检查异常,如果抛出的话,必然是没有先判断变量是否等于null
if(user!=null){
user.save();
}

而已检查异常如IOException,程序员如果想要一辈子不让程序抛出它是不可能的,因为没法控制网络的链接一直保持有效,你可以把网线做的很坚固,但是人家电信那出故障了,一样还是要抛出这个异常。

所以已检查异常是不可控的,所以在程序中一定要对他try/catch或throws到上层调用方法
而未检查异常是可控的,只要你有足够的经验,可以让他一辈子不被抛出
DeepNightTwo 2008-07-23
  • 打赏
  • 举报
回复
当然如果是应付面试,你可以说java就两种异常,一种是编译期异常,需要coder自己编程处理:catch住或者throw出去,一种是运行期异常,不需要编程处理,但是为了程序的容错性,也可以catch住处理或者throw。
DeepNightTwo 2008-07-23
  • 打赏
  • 举报
回复
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里面了 :)。
sagezk 2008-07-23
  • 打赏
  • 举报
回复
2楼正解

62,612

社区成员

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

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