0%

【Java基础】异常处理

Java编程中异常处理的学习记录

异常处理

一、异常定义:

  • 程序执行中法神的不正常情况称为异常(不是语法错误/逻辑错误)

二、异常类型:

  • (1)Error: Java虚拟机无法解决的严重问题(JVM系统内部错误、资源耗尽)
  • (2)Exception: 其他因编程错误或偶然的外在因素导致的一般性问题(一般说的异常都是指Exception)

三、Exception分类:

  • (1)编译异常
  • (2)运行异常[RuntimeException]: 以下是常见运行异常
1
2
3
4
5
6
7
8
9
10
11
NullPointerException(空指针异常)

ArrayIndexOutOfBoundsException(数组角标越界异常)

ClassCastException(类型转换异常)

NumberFormatException(数字格式异常)

InputMismatchException(输入不匹配异常)

ArithmeticException(算术异常)

四、异常处理方式:

  • (1)try-catch-finally(自行处理异常)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//try-catch-finally结构:

try{
//可能出现错误的代码
}catch(异常类型1 变量名1){
//处理异常1的方法
}catch(异常类型2 变量名2){
//处理异常2的方法
}
......
......
finally{
//一定会执行的代码
}
    • try-catch注意点:
      • (1)catch异常中,出现子父类关系时,父类必须在子类下面
      • (2)一旦匹配到某个catch异常后,就不会再匹配其他异常,直接到finally结构中
      • (3)try结构中的变量无法在外面使用,如要在外面使用,在try之前将变形声明好并赋初始值
      • (4)常用的处理方法为:System.out.println(e.getMessage) 或 e.printStackTrace
    • finallly注意点:
      • (1)finally是可选的,不一定要加上去
      • (2)finally一定会执行,无论catch是都会再报错,或前面出现return语句,一样会被执行
      • (3)finally一般用在数据库连接,输入输出流,网络编程Socket等JVM不能自动回收的物理连接,确保一定能够关闭资源,不占内存。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//代码演示:

@Test
public int test1(){
try {
int[] arr = new int[10];
System.out.println(arr[10]);//数组角标越界异常
return 1;
}catch(Exception e) {//报错,执行catch内容
return 2;
}finally {//虽然有return语句,但finally一定会执行
System.out.println("一定会被执行");
}
}
  • (2)throws + 异常类型(抛出异常,寻求帮助,自己无法解决)

    1
    2
    3
    4
    5
    throws + 异常类型 结构:

    public void method() throws Exception{
    //可能出现异常代码
    }
    • throws 注意点:
      • (1)throws出现异常只是返回一个异常对象,后续代码不再执行
      • (2)throws中出现子父类关系时,子类throws异常要小于父类,并且父类如果没throws语句,子类也不能添加throws语句
  • (3)throw new 异常类型() —(手动抛出异常)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//代码实例:

public void regist(int id) {
try {
if (id > 0) {
this.id = id;
}else {
//正常情况:System.out.println("输入数据非法")
throw new Exception("输入数据非法");//手动抛出异常
}
} catch (Exception e) {
System.out.println(e.getMessage());//处理异常
}
}
    • throw注意点:
      • 一般配合 “try-catch-finally结构” 或 “throws+异常类型” 来使用

五、额外拓展

  • 自定义异常类:
    • (1)继承现有的异常结构RuntimeException / Exception
    • (2)提供全局变量:serivalVersionUID
    • (3)提供重载构造器
1
2
3
4
5
6
7
8
9
10
11
12
13
实例:

public class MyException extends RuntimeException{

static final long serialVersionUID = -70546873213L;//标识异常类型编号

//构造器-空参/带参
public MyException() {}

public MyException(String msg) {
super(msg);
}
}

六、常见面试题

  • throw 和 throws 区别:
    • (1)throw 表示抛出一个异常类的对象,生成异常对象的过程。声明在方法体类
    • (2)throws 属于异常处理的一种方法,声明在方法的声明处