10.4 使用throw抛出异常
当程序出现错误时,系统会自动抛出异常;除此之外,Java
也允许程序自行抛出异常,自行抛出异常使用throw
语句来完成(注意此处的throw
没有后面的s
,与前面声明抛出的throws
是有区别的)。
10.4.1 抛出异常
很多时候,系统是否要抛出异常,可能需要根据应用的业务需求来决定,如果程序中的数据、执行与既定的业务需求不符,这就是一种异常
。由于与业务需求不符而产生的异常,必须由程序员来决定抛出,系统无法抛出这种异常。
如果需要在程序中自行抛出异常,则应使用throw
语句, throw
语句可以单独使用,** throw
语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例**。
当Java
运行时接收到开发者自行抛出的异常时,同样会中止当前的执行流,跳到该异常对应的catch
块,由该catch
块来处理该异常。也就是说,不管是系统自动抛出的异常,还是程序员手动抛出的异常,Java
运行时环境对异常的处理没有任何差别。
- 如果
throw
语句抛出的异常是Checked
异常,则该throw
语句要么处于try
块里,显式捕获该异常,要么放在一个带throws
声明抛出的方法中,即把该异常交给该方法的调用者处理; - 如果
throw
语句抛出的异常是Runtime
异常,则该语句无须放在try
块里,也无须放在带throws
声明抛出的方法中;程序既可以显式使用try-catch
来捕获并处理该Runtime
异常,也可以完全不理会该异常,把该异常交给该方法调用者处理。
例如下面例子程序:
1 | public class ThrowTest |
通过上面程序也可以看出,自行抛出Runtime
异常比自行抛出Checked
异常的灵活性更好。同样,抛出Checked
异常则可以让编译器提醒程序员必须处理该异常。