7. 异常

异常

java.lang.Throwable 是 Java 语言中所有错误或异常的超类。

1. Error

Error 是 Throwable的子类,用于指示合理的应用程序不应该试图捕获的严重问题。例如 VirtualMachineError

2. Exception

Exception可以分为两大类,运行时异常和编译时异常。运行时异常包括 RuntimeException 和它的子类。编译时异常是除了 RuntimeException 之外的异常。出编译时异常都会要求加上 try…catch或者 throws

异常的处理

finally 和 return

当 finally 里面有 return,那么结果就是 finally 中的
当 finally 里面没有 return,那么结果就是返回 try 或者 catch 中

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
package com.itguigu.com;

public class TestFinallyReturn {
public static void main(String[] args) {
System.out.println(getNum()); // 40
System.out.println(getNum2()); // 20
}

public static int getNum() {
int i=10;

try {
i=20;
return i;
} catch (Exception e) {
i=30;
return i;
}finally {
i=40;
return i;
}
}

public static int getNum2(){
int i=10;

try {
i=20;
return i;
} catch (Exception e) {
i=30;
return i;
}finally {
i=40;
}
}
}

throws

用在声明一个方法的时候,明确声明该方法可能抛出 xx 异常。说明该异常在该方法中没有 try…catch,由调用者处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.itguigu.com;

public class TestThrows {
public static void main(String[] args) {
try {
divide(10, 2);
} catch (ArithmeticException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

// throws 后面可以接多个异常,顺序无所谓。一般如果父类有异常,那么子类异常就不用写了
public static int divide(int a, int b) throws ArithmeticException, Exception{
return a/b;
}
}

throws 与方法重写:子类抛出的异常类型应该小于等于父类抛出的异常类型。

方法重写的要求学习完毕(两同两小一大)

  1. 方法名:必须相同

  2. 行参列表:必须相同

  3. 返回值类型

    基本数据类型和 void:必须相同

    引用数据类型:小于等于父类

  4. 权限修饰符:大于等于父类

  5. 抛出的异常列表类型:小于等于父类

throw

throw 的作用是用于主动抛出异常。如果没有 try…catch,他可以代替 return 结束当前方法。但是无法返回正常的结果。只能带回 “异常对象”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.itguigu.com;

public class TestThorw {
public static void main(String[] args) {
try {
test();
} catch (Exception e) {
System.out.println(e.getMessage()); // 获取抛出的错误信息
e.printStackTrace(); // 打印异常的堆栈信息
}
}

public static void test() throws Exception {
throw new Exception("运行时异常");
}
}

自定义异常

自定义异常的要求:

  1. 要将一个变成 “异常类型”,那么这个类必须继承 Throwable,或者继承它的子类。

  2. 自定义异常对象只能由 throw 语句手动抛出。然后可以加上 try…catch 或者使用 thrors 抛给上层。

  3. 建议自定义异常,添加两个装饰器。

    3.1 无参构造尽量保留

    3.2 有参构造。异常类型(String message),可以为 message 赋值。

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
package com.itguigu.com;

public class TestDefineException {
public static void main(String[] args) {
try {
test();
} catch (UsernameOrPassword e) {
System.out.println(e.getMessage());
}
}

public static void test() throws UsernameOrPassword {
// 手动抛出自定义异常
throw new UsernameOrPassword("用户名或密码错误");
}
}

// 定义一个异常,继承自 Throwable 的子类 Exception
class UsernameOrPassword extends Exception{
public UsernameOrPassword() {
super();
}

public UsernameOrPassword(String message) {
super(message);
}
}