手动抛出异常与自定义异常

1. 手动抛出异常对象:throw

Java 中异常对象的生成有两种方式:

  • 由虚拟机自动生成:程序运行过程中,虚拟机检测到程序发生了问题,那么针对当前代码,就会在后台自动创建一个对应异常类的实例对象并抛出。

  • 由开发人员手动创建new 异常类型([实参列表]);,如果创建好的异常对象不抛出对程序没有任何影响,和创建一个普通对象一样,但是一旦throw抛出,就会对程序运行产生影响了。

1.1 使用格式

throw new 异常类名(参数);

throw语句抛出的异常对象,和JVM自动创建和抛出的异常对象一样。

  • 如果是编译时异常类型的对象,同样需要使用throws或者try…catch处理,否则编译不通过。

  • 如果是运行时异常类型的对象,编译器不提示。

  • 可以抛出的异常必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误:

    throw new String("want to throw");

1.2 使用注意点:

无论是编译时异常类型的对象,还是运行时异常类型的对象,如果没有被try..catch合理的处理,都会导致程序崩溃。

throw语句会导致程序执行流程被改变,throw语句是明确抛出一个异常对象,因此它下面的代码将不会执行

如果当前方法没有try…catch处理这个异常对象,throw语句就会代替return语句提前终止当前方法的执行,并返回一个异常对象给调用者。

package com.atguigu.keyword;  
​  
public class TestThrow {  
    public static void main(String[] args) {  
        try {  
            System.out.println(max(4,2,31,1));  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        try {  
            System.out.println(max(4));  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        try {  
            System.out.println(max());  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
​  
    public static int max(int... nums){  
        if(nums == null || nums.length==0){  
            throw new IllegalArgumentException("没有传入任何整数,无法获取最大值");  
        }  
        int max = nums[0];  
        for (int i = 1; i < nums.length; i++) {  
            if(nums[i] > max){  
                max = nums[i];  
            }  
        }  
        return max;  
    }  
}  

2. 自定义异常

2.1 为什么需要自定义异常类

Java中不同的异常类,分别表示着某一种具体的异常情况。那么在开发中总是有些异常情况是核心类库中没有定义好的,此时我们需要根据自己业务的异常情况来定义异常类。例如年龄负数问题,考试成绩负数问题,某员工已在团队中等。

2.2 如何自定义异常类

(1)要继承一个异常类型

自定义一个编译时异常类型:自定义类继承java.lang.Exception

自定义一个运行时异常类型:自定义类继承java.lang.RuntimeException

(2)建议大家提供至少两个构造器,一个是无参构造,一个是(String message)构造器。

(3)自定义异常需要提供serialVersionUID

2.3 注意点

  1. 自定义的异常只能通过throw抛出。

  2. 自定义异常最重要的是异常类的名字和message属性。当异常出现时,可以根据名字判断异常类型。比如:TeamException("成员已满,无法添加");TeamException("该员工已是某团队成员");

  3. 自定义异常对象只能手动抛出。抛出后由try..catch处理,也可以甩锅throws给调用者处理。

2.4 举例

class MyException extends Exception {  
    static final long serialVersionUID = 23423423435L;  
    private int idnumber;  
​  
    public MyException(String message, int id) {  
        super(message);  
        this.idnumber = id;  
    }  
​  
    public int getId() {  
        return idnumber;  
    }  
}  
​

public class MyExpTest {  
    public void regist(int num) throws MyException {  
        if (num < 0)  
            throw new MyException("人数为负值,不合理", 3);  
        else  
            System.out.println("登记人数" + num);  
    }  
    public void manager() {  
        try {  
            regist(100);  
        } catch (MyException e) {  
            System.out.print("登记失败,出错种类" + e.getId());  
        }  
        System.out.print("本次登记操作结束");  
    }  
    public static void main(String args[]) {  
        MyExpTest t = new MyExpTest();  
        t.manager();  
    }  
}  
​
Java基础

异常的处理

2025-8-9 15:22:55

Java基础

集合框架概述

2025-8-10 13:52:20

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索