10.4 使用throw抛出异常 10.4.1 抛出异常

10.4 使用throw抛出异常

当程序出现错误时,系统会自动抛出异常;除此之外,Java也允许程序自行抛出异常,自行抛出异常使用throw语句来完成(注意此处的throw没有后面的s,与前面声明抛出的throws是有区别的)。
顺便说一下:java中以字母s结尾的一般用在声明中,如throws,extends,implements

10.4.1 抛出异常

很多时候,系统是否要抛出异常,可能需要根据应用的业务需求来决定,如果程序中的数据、执行与既定的业务需求不符,这就是一种异常由于与业务需求不符而产生的异常,必须由程序员来决定抛出,系统无法抛出这种异常。

throw抛出的是一个异常对象

如果需要在程序中自行抛出异常,则应使用throw语句,throw语句可以单独使用,throw语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例

1
throw ExceptionInstance;

java处理自定义异常和处理系统异常一样

Java运行时接收到开发者自行抛出的异常时,同样会中止当前的执行流,跳到该异常对应的catch块,由该catch块来处理该异常。
也就是说,不管是系统自动抛出的异常,还是程序员手动抛出的异常,Java运行时环境对异常的处理没有任何差别。

  • 如果throw语句抛出的异常是Checked异常,则该throw语句
    • 要么处于try块里,显式捕获该异常,
    • 要么放在一个带throws声明抛出的方法中,即把该异常交给该方法的调用者处理;
  • 如果throw语句抛出的异常是Runtime异常,则该语句无须放在try块里,也无须放在带throws声明抛出的方法中;程序既可以显式使用try-catch来捕获并处理该Runtime异常,也可以完全不理会该异常,把该异常交给该方法调用者处理。

程序示例

例如下面例子程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class ThrowTest
{
public static void main(String[] args)
{
try
{
// 调用声明抛出Checked异常的方法,要么显式捕获该异常
// 要么在main方法中再次声明抛出
throwChecked(-3);
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
// 调用声明抛出Runtime异常的方法既可以显式捕获该异常,
// 也可不理会该异常
throwRuntime(3);
}
public static void throwChecked(int a)throws Exception
{
if (a > 0)
{
// 自行抛出Exception异常
// 该代码必须处于try块里,或处于带throws声明的方法中
throw new Exception("a的值大于0,不符合要求");
}
}
public static void throwRuntime(int a)
{
if (a > 0)
{
// 自行抛出RuntimeException异常,既可以显式捕获该异常
// 也可完全不理会该异常,把该异常交给该方法调用者处理
throw new RuntimeException("a的值大于0,不符合要求");
}
}
}

通过上面程序也可以看出,自行抛出Runtime异常比自行抛出Checked异常的灵活性更好。同样,抛出Checked异常则可以让编译器提醒程序员必须处理该异常。