Java- 异常处理
- 异常处理能够使一个方法给它的调用者抛出一个异常。
- Java异常是派生自
java.lang.Throwable
的类的实例。Java 提供大量预定义的异常类,例如,Error
、Exception
、RuntimeException
、ClassNotFoundException
、NullPointerException
和ArithmeticException
。也可以通过扩展Exceotion
类来定义自己的异常类。 - 异常发生在一个方法的执行过程中。
RuntimeException
和Error
都是免检异常,其他所有的异常都是必检的。 - 当声明一个方法时,如果这个方法可能抛出一个必检异常,则必须声明为必检异常,告诉编译器可能会出现什么异常。
- 声明异常的关键字是
throws
,而抛出异常的关键字throw
。 - 如果调用声明了必检异常的方法,必须将该方法调用放在
try
语句中。在方法执行过程中出现异常时,catch
块会捕获并处理异常。 - 如果一个异常没有被当前方法捕获,则该异常被传给调用者。这个过程不断重复直到异常被捕获或者传递给 main 方法。
- 可以从一个通用的父类派生出各种不同的异常类。如果一个
catch
块捕获到父类的异常对象,它也能捕获这个父类的子类的所有异常对象。 - 在
catch
块中,异常被指定顺序是非常重要的。如果在一个类的父类的异常对象之前没有指定这个类的一个异常对象,就会导致一个编译错误。 - 当方法中发生异常时,如果异常没有被捕获,方法将会立刻退出。如果方法想在退出前执行一些任务,可以在方法中捕获这个异常,然后再重新抛给真正的处理器。
- 任何情况下都会执行
finally
块中的代码,不管 try 块中是否出现或者捕获了异常。 - 异常处理将错误处理代码从正常的程序设计任务中分离出来,这样,就会使得程序更易于阅读和修改。
- 不应该使用异常处理代替简单的测试。应该尽可能地测试简单异常,将异常处理保留为处理那些无法用 if 语句处理的异常。
必检异常
是指:编译器会强制程序员检查并处理它们。
免检异常
:在大多数情况下,免检异常都会反映出程序设计上不可恢复的逻辑错误。例如:如果通过一个引用变量访问一个对象之前并未将一个对象赋值给它,就会抛出 NullPointerException
异常;如果访问一个数组的越界元素,就会抛出 IndexOutOfBoundsException
异常。这些都是程序中必须纠正的逻辑错误。免检异常可能在程序的任何一个地方出现。为了避免过多的使用 try-catch 块,Java 语言不允许编写代码捕获或声明免检异常。