异常-Exception

异常介绍

  • 基本概念
    Java语言中,将程序执行中发生的不正常情况称为"异常"。(开发过程中的语法错误和逻辑错误不是异常)
  • 执行过程中所发生的异常事件可分为两大类
    1,Error(错误):Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。Error是严重错误,程序会崩溃
    2,Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码处理。例如 空指针访问,试图读取不存在的文件,网络连接中断等等。
    Exception分为两大类:运行时异常(程序运行时,发生的异常)
    编译时异常(编程时,编译器检查出的异常)
  • 异常体系图
  • 异常体系图小结
    1,异常分为两大类:运行时异常;编译时异常
    2,运行时异常:编译器检查不出来,一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常
    3,对于运行时异常,可以不作处理,因为这类异常很普通,若全处理可能会对程序的可持续性和运行效率产生影响
    4,编译时异常,是编译器要求必须处置的异常

运行时异常

  • 常见的运行时
    1,NullPointerException 空指针异常
    2,ArithmeticException 数学运算异常
    3,ArrayIndexOutOfBoundsException 数组下标越界异常
    4,ClassCastException 类型转换异常
    5,NumberFormatException 数字格式不正确异常[]

编译异常

  • 介绍:编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译
  • 常见的编译异常
    1,SQLException//操作数据库时,查询表可能发生异常
    2,IOException//操作文件时,发生的异常
    3,FileNotFoundException//当操作一个不存在的文件时,发生异常
    4,ClassNotFoundException//加载类,而该类不存在时,发生异常
    5,EOFException//操作文件,到文件末,发生异常
    6,IIIegalArguementException//参数异常

异常处理

基本介绍

异常处理就是当异常发生时,对异常处理的方式

异常处理的方式

  • try-catch-finally:程序员在代码中捕获发生的异常,自行处理
  • throws:将发生的异常抛出。交给调用者(方法)来处理,最顶级的处理者就是JVM

异常处理的示意图


try-catch 异常处理

  • 基本介绍:Java提供try和catch块来处理异常。try块用于包含可能出错的代码,catch块用于处理try块中发生的异常,可以根据需要在程序中有多个try-catch块
  • 基本语法
    try{
    //可疑代码
    //将异常生成对应的异常对象,传递给catch块
    }catch(异常){
    //对异常的处理
    }
    //如果没有finally,语法是可以通过的
java 复制代码
public class ExceptionExcerise {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 0;
        int res = 0;
        try {
            res = num1/num2;
        } catch (Exception e) {
            System.out.println(e.getMessage());//输出具体的错误
        }
    }
}

结果

  • try-catch 方式处理异常-注意事项
    1,如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块
    2,如果异常没有发生,则顺序执行try的代码块,不会进入到catch
    3,如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等),则使用如下代码-finally
java 复制代码
public class ExceptionExcerise {
    public static void main(String[] args) {
        //异常处理快捷键:ctrl + atl + t
        //1. 如果异常发生了,则异常发生后面的代码不会执行,直接进入到 catch 块
        //2. 如果异常没有发生,则顺序执行 try 的代码块,不会进入到 catch
        //3. 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码- finally
        try {
            String str = "zl";
            int a = Integer.parseInt(str);
            System.out.println("数字:"+a);//不会执行
        } catch (NumberFormatException e) {
            System.out.println("异常信息="+e.getMessage());
        } finally {
            System.out.println("代码块被执行");//一定会执行
        }
        System.out.println("程序继续");
    }
}

结果

4,可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,比如(Exception在后,NullPointerException在前),如果发生异常,只会匹配一个catch

java 复制代码
public class ExceptionExcerise {
    public static void main(String[] args) {
        try {
            Person person = new Person();
            person = null;
            System.out.println(person.getName());//NullPointerException
            int n1= 10;
            int n2 = 0;
            int res = n1/n2;//ArithmeticException
        } catch (NullPointerException e) {
            System.out.println("空指针异常="+e.getMessage());//只会匹配一个catch
        } catch (ArithmeticException e ){
            System.out.println("算术异常="+e.getMessage());
        }catch (Exception e){
            System.out.println(e.getMessage());
        }finally {
        }
    }
}
class Person{
    private String name = "Jack";

    public String getName() {
        return name;
    }
}

结果

5,可以进行try-finally配合使用,这种永达相当于没有捕获异常,因此程序会直接崩溃退出。

  • try-catch-finally 执行顺序小结
    1,如果没有出现异常,则执行try块中所有语句,不知执行catch块中语句,如果有finally,最后还需执行finally,最后还租要执行finally中的语句
    2,如果出现异常,则try块中异常发生后,try块剩下的语句不再执行。将执行catch块中的语句,如果有finally,最后还需执行finally里面的语句!

throws异常处理

  • 基本介绍
    1,如果一个方法中的语句执行时,可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示的声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理
    2,在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
  • 注意事项
    1,对于编译异常,程序中必须处理,比如try-catch或throws
    2,对于运行时异常,程序中如果没有处理,默认就是throws的方式处理
    3,子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类
    4,在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必throws
java 复制代码
public class ExceptionExcerise {
    public static void main(String[] args) {
        f2();

    }
    public static void f2()/*throws ArithmeticException */{//对于运行时异常,程序中如果没有处理,默认就是throws 的方式处理
        int n1 = 10;
        int n2 = 0;
        double res = n1/n2;
    }
    public static void f1()throws FileNotFoundException {
        //调用 f3() 报错
        //1. 因为 f3() 方法抛出的是一个编译异常
        //2. 即这时,就要 f1() 必须处理这个编译异常
        //3. 在 f1() 中,要么 try-catch-finally ,或者继续 throws 这个编译异常
        f3();//抛出异常
    }
    public static void f3()throws FileNotFoundException {
        FileInputStream fileInputStream = new FileInputStream("C:\\Users\\13627\\Desktop\\照片");//编译异常,文件不存在
    }
    public static  void f4(){
        //1. 在 f4()中调用方法 f5() 是 OK
        //2. 原因是 f5() 抛出的是运行异常
        //3. 而 java 中,并不要求程序员显示处理,因为有默认处理机制
        f5();
    }
    public static void f5()throws ArithmeticException{

    }
}
class Father{
    public void method()throws RuntimeException{

    }
}
class Son extends Father{
    //子类重写父类的方法时,对抛出异常的规定:
    // 子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常类型的子类型
    @Override
    public void method()throws ArithmeticException {

    }
}

结果

自定义异常

  • 基本概念
    当程序中出现了某些"错误",但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息
  • 自定义异常的步骤
    1,定义类:自定义异常类名(自己写)继承Exception或RuntimeException
    2,如果继承Exception,属于编译异常
    3,如果继承RuntimeException,属于运行异常(通常情况下,继承RuntimeException)
    实例:
java 复制代码
public class ExceptionExcerise01 {
    public static void main(String[] args) /*throws AgeException*/{
        int age = 180;
        //要求范围在 18 -- 120 之间,否则抛出一个自定义异常
        if (!(age>=18&&age<=120)){
            //这里我们可以通过构造器,设置信息
            throw new AgeException("年龄需要在18-120之间");
        }
        System.out.println("你的年龄在正常范围");
    }
}

/**
 * 自定义一个异常
 * 1,通常情况下,我们自定义异常是继承RuntimeException
 * 2,即把自定义异常做成 运行时异常,好处时,我们可以使用默认的处理机制
 * 3,也就是比较方便
 */
class AgeException extends RuntimeException{
    public AgeException(String message) {//构造器
        super(message);
    }
}

结果

更改年龄

java 复制代码
public class ExceptionExcerise01 {
    public static void main(String[] args) /*throws AgeException*/{
        int age = 100;
        //要求范围在 18 -- 120 之间,否则抛出一个自定义异常
        if (!(age>=18&&age<=120)){
            //这里我们可以通过构造器,设置信息
            throw new AgeException("年龄需要在18-120之间");
        }
        System.out.println("你的年龄在正常范围");
    }
}

/**
 * 自定义一个异常
 * 1,通常情况下,我们自定义异常是继承RuntimeException
 * 2,即把自定义异常做成 运行时异常,好处时,我们可以使用默认的处理机制
 * 3,也就是比较方便
 */
class AgeException extends RuntimeException{
    public AgeException(String message) {//构造器
        super(message);
    }
}

结果

throw和throws的区别

相关推荐
风象南6 分钟前
SpringBoot 控制器的动态注册与卸载
java·spring boot·后端
醇醛酸醚酮酯24 分钟前
Qt项目锻炼——TODO清单(二)
开发语言·数据库·qt
jioulongzi30 分钟前
记录一次莫名奇妙的跨域502(badgateway)错误
开发语言·python
我是一只代码狗32 分钟前
springboot中使用线程池
java·spring boot·后端
hello早上好1 小时前
JDK 代理原理
java·spring boot·spring
PanZonghui1 小时前
Centos项目部署之Java安装与配置
java·linux
向阳@向远方1 小时前
第二章 简单程序设计
开发语言·c++·算法
沉着的码农1 小时前
【设计模式】基于责任链模式的参数校验
java·spring boot·分布式
Mr_Xuhhh2 小时前
信号与槽的总结
java·开发语言·数据库·c++·qt·系统架构
纳兰青华2 小时前
bean注入的过程中,Property of ‘java.util.ArrayList‘ type cannot be injected by ‘List‘
java·开发语言·spring·list