异常-Java

1 异常概念

  • 异常

    在执行过程中,出现非正常情况导致JVM停止。在Java中异常本身是一个类,产生异常就是创建异常对象并抛出一个异常对象。

  • 异常体系

    1. 异常的根类是java.lang.Throwable,其下有两个子类java.lang.Error和java.lang.Exception

    2. Error:严重错误,无法处理的错误

      Exception:异常,程序员可以通过代码纠正

    3. 常用方法:

      public void printStackTrace():打印异常的详细信息,包含了异常的类型,异常的原因,出现的位置。在开发和调试阶段都得使用。

      public String getMessage():获取发生异常的原因,提示给用户的时候就提示错误原因

异常的处理

  • Java中异常处理的五个关键字: try、catch、finally、throw、throws

1. 抛出异常throw

  • 在指定的方法中抛出指定的异常:throw new xxxException (“异常产生的原因”)

  • 注意事项

    • throw关键字必须写在方法内部

    • throw关键字后边new的对象必须是Exception或者它的子类对象

    • throw关键字抛出指定的异常独享就必须处理这个异常对象。若创建的是RuntimeException或者RuntimeException的子类对象,可以交给JVM处理。若创建的是编译异常,就必须处理(throws或者try catch)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static int getElemnt(int[] arr,int index){
if(arr == null){
throw new NullPointerException("传递的数组值是空");
}
if(index >= arr.length || index < 0){
throw new ArrayIndexOutOfBoundsException("数组越界异常");
}
int ele = arr[index];
return ele;
}
public static void main(String[] args) {
// int[] arr = null;
// System.out.println(getElemnt(arr,0));
int[] arr1 = new int[3];
System.out.println(getElemnt(arr1,3));
}

2. Objects非空判断

  • public static < T > requireNonNull(T obj):查看指定引用对象不是null
1
2
int[] arr = null;
Objects.requireNonNull(arr,"传递的对象值为空");

3. 声明异常throws

  • 当方法内部抛出异常对象的时候,可以使用throws关键字处理异常对象,把异常对象申明抛出给方法的调用者处理(throws或者try catch)。

    修饰符 返回值类型 方法名(参数列表)throws AAAException,BBBException{

    ​ throw new AAAException(“产生原因”);

    ​ throw new BBBException(“产生原因”);

    }

  • throws关键字后面声明的异常必须是Exception或者其子类,方法内部抛出多个异常都必须声明。若存在父子类关系,就直接声明父类

1
2
3
4
5
6
7
8
9
10
11
12
public static void readFile(String fileName) throws IOException {
if(!fileName.endsWith(".txt")){
throw new IOException("文件后缀名不对");
}
if(!fileName.equals("D:\\hxx.txt")){
throw new FileNotFoundException("文件路径错误");
}
System.out.println("读取");
}
public static void main(String[] args) throws IOException {
readFile("D:\\qzy.txt");
}

4. 捕获异常try catch

try{//可能会产生异常的代码}

catch(异常类名 变量名){//异常的处理逻辑 }

1
2
3
4
5
6
7
public static void main(String[] args)  {
try {
readFile("D:\\qzy.txt");
} catch (IOException e) {
e.printStackTrace();
}
}

5. finally代码块

  • 一些特定的代码无论是异常是否发生,都需要执行。因为异常会引起程序跳转,导致有些语句执行不到
  • try....catch......finally:finally一般用于资源释放。
1
2
3
4
5
6
7
8
9
10
public static void main(String[] args)  {
try {
readFile("D:\\qzy.txt");
} catch (IOException e) {
e.printStackTrace();
}
finally {
System.out.println("释放资源");
}
}

6. 注意事项

  • 如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常
  • 父类方法没有抛出异常,子类重写父类该方法时不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出

自定义异常类

  • 格式

    public class XXXException extends Exception | RuntimeException{

    //添加一个空参数的构造方法

    //添加一个带异常信息的构造方法

    }

1
2
3
4
5
6
7
8
public class RegisterException extends Exception{
public RegisterException() {
}

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