异常

什么是异常机制?
异常指的是在程序运行过程中发生的异常事件,通常是由外部问题(如硬件错误、输入错误)所导致的程序不能按照预期执行时。程序处理问题的一种方式。
为什么使用异常。

public class Son {
    //根据父亲和母亲的身高计算儿子的身高。
    public double getSonHeight(double f,double m){
        if(f<=0){
            //停止执行下面的代码 并提醒调用者错误信息。
//            System.out.println("父亲身高输入有误");
            throw new RuntimeException("父亲身高输入有误");
        }

        double height=(f+m)/2+5;
        return height;
    }
}

在我们实际开发中, 有返回值的函数需要进行返回数据,但是有的时候 参数非法性 导致我们的函数无法正常执行 所以就无法正常return 返回数据。例如 我们现在有一个获取孩子身高的函数,函数的参数为 父亲 和 母亲的身高,参数类型为 doub1e ,但是 我们如果参数传递为 负数,从语法的角度讲没有问题,因为doub1e类型 包含负数,但是一旦传递负数 就不符合我们实际情景了,因为一个人的身高不可能为负数,所以我们在正常代码执行之前需要进行安全判断,如果参数有问题 则 使用异常的形式进行返回。
如何抛出异常---执行方

如何处理异常--->调用方
第一种: 异常转移【继续抛】

当执行方出现异常后,我们调用方可以把异常继续抛给调用该方法处。
语法:
  public 返回类型 方法名(参数列表) throws 异常类,异常类型,异常类型{
         
  }
把异常抛给调用方法的位置,所有调用方都继续往上抛异常,最终异常抛给了jvm。 jvm简单粗暴的方式:终止程序,并打印异常信息。  

第二种: try处理
语法:

try{
   //可能发生异常的代码
}catch(异常类型 e){
   //处理异常的代码
}finally{
   //有没有异常都会执行该代码。
}

finally
最终执行的代码---{有误异常都会被执行的代码}。一般用于资源的关闭【比如io流,jdbc等】。
关闭资源模拟:

public class Test03 {
    public static void main(String[] args) {
      fun();
    }
    public static String fun(){
        System.out.println("输入密码打开保险柜");
        try {
            System.out.println("取钱~~~~~~");
            int c = 10 / 0;//异常机制。保险柜没有关闭
            return "流程正常";
        }catch (RuntimeException e){
            System.out.println("处理意外");
        }finally {
            System.out.println("关闭保险柜"); //无论是否存在异常,都会被执行的代码。 [即使遇到return后finally代码依然会执行]。一般用于资源的关闭。
        }
        return "流程出现非正常";
    }
finally可以单独和try使用。用法不常用。异常没有处理。

try{

}finally{

}

异常的类型
在jdk中提高了大量的异常类。我们之前就使用了一个RuntimeException异常类。

Error不归程序员管,这种异常是java公司自己研发使用的。

我们主要的还是Exception:它是我么们程序最容易出现的异常。里面分为运行时异常和编译时异常。

运行时异常:当前程序运算的时候才会出现的异常,而且这种异常无需再编译时强制处理。

编译时异常: 程序再编译的时候就要求强制处理该异常。不然程序无法执行。
自定义异常类
JDK已经帮你提供了大量的异常类,如果jdk提供的无法满足你的需求,你可以自己定义异常类。

自定义异常类的目标: 见名知意。 当出现这个异常类型时,我就指定错误的原因。

比如年龄不合法时,抛出了一个RuntimeException异常对象。

步骤:

定义一个类并继承RuntimeException. 定义一个有参构造方法。
public class AgeException  extends RuntimeException{

    public AgeException(String msg){
        super(msg); //调用父类的构造方法
    }
}

例子:
自定义异常类:

public class AgeException extends RuntimeException{//继承RuntimeException
    public AgeException() {
    }

    public AgeException(String message) {
        super(message);//调用RuntimeException中的方法体。
    }
}

使用自定义异常

public class Student{
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age)  {
        if (age<6){
            throw  new AgeException("年龄有误");
        }
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

posted on 2024-08-31 14:27  小木不痞  阅读(4)  评论(0编辑  收藏  举报

导航