所谓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也同样没有。
因为IOException是非运行时异常, 无法用程序去显示处理(这个解释起来比较绕口), 但是你只要知道这种非运行时异常不是你程序的问题, 而是外部的问题, 比如你读文件, 压根就没有这个文件, 就会出现IOException, 所以说, 这种非运行时异常不是你修改程序就能解决的问题(意思就是不怪你, 怪找不到那个文件)
java中要求非运行时异常必须要通过函数抛出, 这种非运行时异常为什么要通过函数来抛出, 是为了让编译器去帮你定位这些异常是出现在哪些代码段里, 从而告诉你这里你必须try和catch....., 注意是必须, 如果你不trycatch, 那么编译都不会通过., 所以非运行时异常也叫做可检测异常
IllegalStateException是运行时异常, 就是只有在运行时才有可能出现的异常, 是你程序写得有问题, 需要你通过修改程序来避免,编译器是无法帮助你的, 即使你不去trycatch, 编译器也不会报错, 所以编译器也就没有要求你一定要在函数处抛出这类异常
我语文不太好, 反正希望你能理解我的意思 ......................
异常分两种,一种是可抓可不抓的,一种是必须抓的。可抓可不抓的异常就可以不用写throws,必须抓的异常那就必须要写throws了。
throws 是说明本方法会抛出异常
throw 是真的要抛出异常的时候用。
方法内,全catch可不抛出。但,如果是实现接口、继承抽象类,则要根据原方法定义一致。
请举个不用的例子~