如何自定义异常

目录

异常

Throwable中的成员方法:

处理异常的方式:

1.try/catch/finally

2.throws和throw

自定义异常

为什么要使用自定义异常?

注意:所有异常都必须是Throwable 的子类。 如果希望写一个检查性异常类,则需要继承Exception类。 如果我们想写一个运行时异常类,那么需要继承 RuntimeException类。

实例:

题目:

思路:

代码:

结果:


异常

异常:是程序本身可以处理的异常。也就是我们常见的空指针异常(NullPointerException),数组超出范围异常(IndexOutOfBoundsException)等。

异常分为三种:

检查性异常(checked exceptions):编译器要求你必须处置的异常,在编译时可以检查出来。

运行时异常(unchecked exceptions):编译器不要求强制处置的异常,往往在运行时才检查出来。

错误:错误其实不算异常的一种,它是程序中无法处理的错误,它们在编译也检查不到的。

如图:Throwable是所有异常类的父类,它是一个普通类。Error 出错后,程序无法处理;Exception 出错后,程序可处理。

 

Throwable中的成员方法:

public String getMessage():返回此 throwable 的详细消息字符串

public String toString():获取异常类名和异常信息。

public void printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。

public void printStackTrace(PrintStream s):通常用该方法将异常内容保存在日志文件中,以便查阅。

处理异常的方式:

1.try/catch/finally

格式:

try {
可能出现问题的代码;
} catch(异常类名 异常对象) {
异常处理的代码
} finally {
释放未关闭的资源 
}
​
​
举例:
    try {
                res= num1/num2;
            }catch (Exception e){
                System.out.println("出现异常了");
                e.printStackTrace();
            }

注意:

catch不能独立存在 ,必须依赖于try;

catch可以有多个;

finally在最后面可写可不写,看你自己。 总结: try 必须存在,后可接finally,catch,或者三个都有

2.throws和throw

概念:有的时候我们没有权限处理该异常,我们不知道该如何处理异常,或者不想处理异常,这种情况下我们可以将异常抛出,抛出给调用者处理。(就是你没有能力或者想摆烂,你就抛异常

格式:

[访问权限修饰符] 返回值类型 方法名(参数列表) [throws 异常类名]{
方法体;
[return 返回值]; 
}
​
举例:
//判断是否是三角形方法
    public static void isTriangle(int a,int b,int c) throws IllegalArgumentException{//抛出一个非法的参数异常
​
            try {//把可能会出现异常的代码放在try...catch中
                if((a+b>c) && (b+c>a) &&(a+c)>b){
                    System.out.println(a+"\t"+b+"\t"+c);
                }else {
                    throw new IllegalArgumentException("不能构成三角形");//新建一个隐式异常的对象
                }
                //System.out.println(i1+"\t"+i2+"t"+i3);
            } catch (Exception e) {
                System.out.println("错误");
                e.printStackTrace();//上面Throwable类的成员方法:获取异常类名和异常信息,以及异常出现在程序中的位置
            }
        }

注意:

1.⼀个⽅法可以声明抛出多个异常,即throws后可以跟多个异常(如IllegalArgumentException,IOException),多个异常用逗号隔开

2.throw和throws搭配一般用于自定义异常 单独使用throw编译出错,报错信息: java:未报告的异常错误java.lang.Exception

自定义异常

为什么要使用自定义异常?

已知的异常类已经不满足我们的需求的时候,我们就可以自定义异常。

怎么自定义:

注意:所有异常都必须是Throwable 的子类。 如果希望写一个检查性异常类,则需要继承Exception类。 如果我们想写一个运行时异常类,那么需要继承 RuntimeException类。

实例:

题目:

编写程序接收用户输入分数信息,如果分数在0—100之间,输出成绩。如果成绩不在该范围内,抛出异常信息,提示分数必须在0—100之间。

要求:使用自定义异常实现

思路:

自定义类:我们先新建一个MyException类 继承 Exception(检查性异常类),在类里面创建无参和有参的构造方法。

成绩类:输入一个成绩,再对成绩进行判断,如果成绩>100或者<0,就新建我们自定义的异常类对象。因为对成绩的判断容易出错,所以我们把该判断放在try...catch里

代码:

//成绩类
public class Grade {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个成绩:");
        int gredee = scanner.nextInt();
        try {
            if(gredee>100 || gredee<0){//对成绩进行判断
               throw new MyException("输入的数字不对,分数必须在0—100之间");
            }else {
                System.out.println("分数是:"+gredee);
            }
        } catch (MyException e) {
            e.printStackTrace();
        }
    }
}
​
===============
//自定义类
  public class MyException extends Exception{
    //无参默认构造方法
    public MyException() {
        super();
    }
​
    //有参的构造方法
    public MyException(String message) {
        super(message);
    }
}  

结果:

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值