java一个疑问,为什么有些异常throw出去需要在函数头用throws声明,一些就不用。

thrownewIllegalStateException(".");不用在函数头声明throwsIllegalStateExceptionthrownewIOExcep... throw new IllegalStateException(".");
不用在函数头声明throws IllegalStateException
throw new IOException(".");
不声明throws编译不通过
两种情况
1、Integer.parseInt("1");这个java.lang包里面的方法,有throws NumberFormatException,但我调用的时候不用catch
2、
public final DefaultIoFilterChainBuilder getFilterChain() {
throw new IllegalStateException(
"Current filter chain builder is not a DefaultIoFilterChainBuilder.");
}
这个方法,我不用声明throws照样可以编译通过
展开
 我来答
Anson0370
2013-01-22 · TA获得超过1462个赞
知道小有建树答主
回答量:702
采纳率:100%
帮助的人:701万
展开全部
所谓checked exception和runtime exception

checked exception告知外部用户此方法在某些情况下可能抛出这个错误,你应该捕获并处理错误以便程序在可能的情况下能够继续运行下去(当然你也可以通过throws声明将异常再往上层暴露,但终究有一层是要去catch这个异常的)。这些错误往往是可预期而且可以作为异常流来处理的。checked exception作为语法上的一种强制措施让你在代码编译阶段就必须对异常进行处理。

比如IOException,当你打开、读取、写入文件时可能抛出这个错。你可以捕获并提示最终用户『文件操作失败,请重试』等信息,而不是任由它抛到JVM中导致当前线程挂掉。

而runtime exception可能产生于运行时的一些不可预知的时刻,而且往往产生后没有有效的手段处理,因此不需要强制对其进行声明和捕获。

你可以认为checked exception就是要强制你去处理这个异常(不管你throws多少层,你终归要在某个地方catch它);而runtime exception则没有这个限制,你可以自由选择是否catch。

=== 分割线 ===

事实上我觉得checked exception是一个非常2B的设计,很多语言中都没有这种设计。API设计并不需要这种强制处理的错误,可以通过封装返回值来做到更友好的处理。
单说Java的变种Groovy(确切来说不能叫变种,不过语法也相似)就没有这么蛋疼的设计;Scala也同样没有。
追问
是在哪里声明checked exception的,还是限定只有几种的。
自己定义的异常可以声明这种的吗,还是只能继承runtime
追答
你继承自RuntimeException就是runtime的exception 直接继承自Exception就是checked exception
http_p
2013-01-22 · TA获得超过1095个赞
知道小有建树答主
回答量:733
采纳率:100%
帮助的人:585万
展开全部
因为IOException是非运行时异常, 无法用程序去显示处理(这个解释起来比较绕口), 但是你只要知道这种非运行时异常不是你程序的问题, 而是外部的问题, 比如你读文件, 压根就没有这个文件, 就会出现IOException, 所以说, 这种非运行时异常不是你修改程序就能解决的问题(意思就是不怪你, 怪找不到那个文件)

java中要求非运行时异常必须要通过函数抛出, 这种非运行时异常为什么要通过函数来抛出, 是为了让编译器去帮你定位这些异常是出现在哪些代码段里, 从而告诉你这里你必须try和catch....., 注意是必须, 如果你不trycatch, 那么编译都不会通过., 所以非运行时异常也叫做可检测异常

IllegalStateException是运行时异常, 就是只有在运行时才有可能出现的异常, 是你程序写得有问题, 需要你通过修改程序来避免,编译器是无法帮助你的, 即使你不去trycatch, 编译器也不会报错, 所以编译器也就没有要求你一定要在函数处抛出这类异常

我语文不太好, 反正希望你能理解我的意思 ......................
追问
也谢谢你的回答,大概懂了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jiangfeilong8
2013-01-22 · 超过53用户采纳过TA的回答
知道答主
回答量:225
采纳率:100%
帮助的人:140万
展开全部
异常分两种,一种是可抓可不抓的,一种是必须抓的。可抓可不抓的异常就可以不用写throws,必须抓的异常那就必须要写throws了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-01-22
展开全部
throws 是说明本方法会抛出异常

throw 是真的要抛出异常的时候用。

方法内,全catch可不抛出。但,如果是实现接口、继承抽象类,则要根据原方法定义一致。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
不倒翁_白痴
2013-01-22 · TA获得超过283个赞
知道小有建树答主
回答量:186
采纳率:0%
帮助的人:133万
展开全部
请举个不用的例子~
追问
第一个就是不用的throw new IllegalStateException(".");
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式