异常处理的根本优势 检测错误
异常处理通常需要更多的时间和资源。如果想让该方法的调用者处理异常,应该创建一个异常对象并将其抛出。如果能在发生异常的方法中处理异常,那么就不需要抛出或使用异常。
什么时候应该使用try-catch块 当必须处理不可预料的错误状况时应该使用它。
概念
- try块
包含的是在正常情况下执行的代码 - catch快
执行捕捉到try块抛出异常后的处理。处理这个异常的代码称为异常处理器。寻找处理器的过程称为捕获一个异常。
从一个通用父类可以派生出各种异常类。如果一个catch块可以捕获一个父类的异常对象,它就能捕获那个父类的所有子类的异常对象。 - finally子句
不论异常是否出现或者是否被捕获,都希望执行某些代码。使用finally子句时可能会忽略catch块。 - throw语句
抛出一个异常 - throws
声明抛出的异常
如果方法没有在父类中声明异常,就不能在子类中对其进行覆盖来声明异常。
异常类型
Throwable类
所有异常类的根,所有Java异常类都直接或间接地继承该类。
- 系统错误 system error
有JVM抛出,用Error类表示,该类描述的是内部系统错误。如果发生,除了通知用户以及尽量稳妥地终止程序外,几乎什么都不做。
- LinkageError 一个类对另一个类有某种依赖性,编译前者后,后者变得不兼容
- VirtualMachineError JVM终端或者没有继续运行所必须的资源可用
- 异常 exception
用Exception类表示,描述的是由程序和外部环境所引起的错误,内被程序捕获和处理。
- ClassNotFoundException 企图使用一个不存在的类
- IOException 输入/输出相关的操作异常。
- 运行时异常 runtime exception
用RuntimeException类表示,描述的是程序设计错误,运行时异常是由JVM虚拟机抛出。
- ArithmeticException 一个整数除以零。
- NullPointerException 企图通过一个null引用变量访问一个对象
- IndexOutOfBoundsException 数组的下标超出范围
- IllegalArgumentException 传递给方法的参数非法或不合适
RuntimeException、Error以及它们的类都成为免检异常。其他所有异常都称为必检异常,意思是编译器会强制程序员检查并处理它们。
重新抛出异常
如果异常处理器没有处理某异常,或者处理器只是希望它的调用者注意到该异常,Java就允许异常处理器重新抛出该异常。
链式异常
需要同原始异常一起抛出一个新异常。