首页 > 技术文章 > 异常

wyzstudy 2021-10-02 21:48 原文

Java语言中,将程序执行中发生的不正常情况统称为“异常”,传统开发过程中的语法错误和逻辑错误不是异常。

执行过程中的异常事件可以分为两大类:

  • Error错误,Java虚拟机无法处理的严重问题,比如JVM系统内存错误,栈溢出等
  • Exception异常,其它因编程错误或者偶然的外在因素导致的一般性问题,可以使用针对性的代码进行解决,这种异常又分为两类:运行时异常,编译时异常。

异常体系结构

异常分为两大类:运行时异常和编译时异常
运行时异常是不要求强制处理的异常,编译器检查不出来,一般指编程时的逻辑错误,是程序员应该避免出现的异常,对于运行时异常,可以不作处理,这类异常很普遍,若全部处理可能会对程序的可读性和运行效率产生影响。
编译时异常是编译器要求必须处理的异常。

常见运行时异常

1.NullPointerException空指针异常

String name = null;
System.out.println(name.length());

2.ArithmeticException数学运算异常

int num = 10;
int num1 = 0;
int result = num / num1;

3.ArrayIndexOutOfBoundsException数组下标越界异常

int[] nums = {1,2};
System.out.println(nums[2]);

4.ClassCastException类型转换异常

class A{}
class B extends A{}
class C extends A{}
A a = new B();
B b = (B) a;
C c = (C) a;

5.NumberFormatException数字格式不正确异常

String num = "数组";
System.out.println(Integer.parseInt(num));

异常处理方式

在Java中有两种异常处理方式:

  • try-catch-finally,在代码中捕获异常,自行处理

    try{
        String name = null;
        System.out.println(name.length());
    }catch(Exception e){
        e.printStackTrace();
    }
    

    1.当发生异常以后,在异常后面的代码是不会执行的

    2.没有发生异常,catch语句块就不会被执行

    3.如果希望不管有没有异常发生都执行某段代码可以使用finally语句块

    4.可以有多个异常,进行分别捕获,要求子异常在前面先捕获,父异常在后面,后捕获。

  • throws,将发生的异常抛出,交由调用者处理,最顶级的处理者是JVM,throws即可以抛出一个异常,也可以抛出多个异常
    1.编译异常,在程序中必须处理
    2.对于运行时异常,如果程序中没有处理,默认就是throws抛出异常
    3.在重写的过程中,子类抛出的异常,要么跟父类一样,要么是父类的子类型,不能比父类大
    4.如果有try-catch就不用throws

对于编译型异常,程序中一定要处理,对于运行时异常,如果程序中没有处理,会默认的处理行为,throws抛出

自定义异常

  1. 自定义异常类,继承自Exception或者RuntimeException
  2. 如果继承自Exception就是编译异常
  3. 如果继承自RuntimeException就是运行时异常
public class Demo3 {
    public static void main(String[] args) {
        int age = 70;
        if(!(age>=80 && age <= 120)){
            throw new AgeException("年龄必须在80-120之间");
        }
        System.out.println("您输入的年龄正常");
    }
}
class AgeException extends RuntimeException{
    public AgeException(String message) {
        super(message);
    }
}

一般我们都是继承自RuntimeException类,有默认的处理机制,方便。

throw和throws区别

意义 位置 后面跟的东西
throws 异常处理的一种类型 方法声明处 异常类型
throw 手动生成异常对象的关键词 方法体中 异常对象

推荐阅读