Java中的异常

文章介绍了Java中的异常体系,包括Error和Exception的区别,运行时异常与编译时异常的特性。异常在程序中的主要作用是提供错误信息和作为方法的特殊返回值。文章详细阐述了异常的处理方式,包括JVM默认处理和捕获异常的语法,并提供了示例。同时,文章提到了异常的抛出以及如何自定义异常,强调了自定义异常在特定场景下的使用。
摘要由CSDN通过智能技术生成

一、异常体系介绍

 

 

 Error:代表的系统级别的错误(属于严重问题)

        系统一旦出现问题,sun公司会把这些错误封装成Error对象

        Error是给sun公司自己用的,开发人员不需要处理

Exception:叫做异常,代表程序可能出现问题。

        我们通常会用Exception以及他的子类来封装程序出现的问题 

运行时异常:RuntimeException及其子类,编译阶段不会出现异常提醒

        运行时出现的异常(如:数组索引越界异常)

编译时异常:编译阶段就会出现异常提醒的(如:日期解析异常)

二、异常的作用

作用一:异常是用来查询bug的关键参考信息

作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况

三、异常的处理方式

1、JVM默认的处理方式

        (1)把异常的名称,异常原因及异常出现的位置等信息输出在控制台

        (2)程序停止执行,下面的代码就不会再执行了

2、 捕获异常(自己处理)

格式:

try{

    //可能出现异常的代码

} catch (异常类名 变量名) {

    //异常的处理代码

}

 注:

(1)如果try中没有遇到问题,怎么执行? 

        会把try里面所有的代码都执行完毕,不会执行catch里面的代码。只有出现了异常才会执行

catch里面的代码。

(2)如果try中可能遇到多个问题,怎么执行?

        会写多个catch与之对应。如果要捕获多个异常,这些异常中如果存在父子关系的话,那么父

类一定要写在下面。

        在JDK7之后,若出现的多个异常采用同一个处理办法时,可以将多个异常通过" | "的符号写

在同一个catch中

(3)如果try中遇到的问题没有被捕获,怎么执行?

        采用JVM虚拟机默认处理异常的方式

(4)如果try中遇到了问题,那么try下面的其他代码还会执行吗?

        不会执行,会直接跳转到对应的catch当中,执行catch里面的语句体

Throwable的成员方法:

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

public String toString()
//返回此可抛出的简短描述

public void printStackTrace()
//把异常的错误信息输出在控制台

3、抛出异常

(1)throws:写在方法定义处,表示声明一个异常,告诉调用者,使用本方法可以会

有哪些异常

public void 方法() throws 异常类名1,异常类名2...{
    ...
}

注意: 

        编译时异常:必须要写

        运行时异常:可以不写

(2)throw:写在方法内,结束方法,手动抛出异常对象,交给调用者,方法中下面的

代码不再执行了

public void 方法(){

    throw new NullPointerException();

}

 例题:

public class ExceptionDemo2 {
    public static void main(String[] args) {
        /*
        需求:键盘录入学生的姓名和年龄
            姓名的长度在3~10之间
            年龄的范围为18~40岁
            超出这个范围时异常数据不能赋值,需要重新录入,一直到录入正确为止

        提示:需要考虑用户在键盘录入时的所有情况
            比如:录入年龄时超出范围,录入年龄时录入了abc等情况
         */
        Scanner sc=new Scanner(System.in);
        Student stu=new Student();

        while (true) {
            try {

                //接收异常
                System.out.println("请输入学生的姓名");
                String name = sc.nextLine();
                stu.setName(name);

                System.out.println("请输入学生的年龄");
                String ageStr=sc.nextLine();
                int age=Integer.parseInt(ageStr);
                stu.setAge(age);

                //如果所有数据都正确,跳出
                break;
            } catch (NumberFormatException e) {

                System.out.println("年龄格式有误,请输入数字");

            } catch (RuntimeException e) {

                System.out.println("姓名长度或年龄范围有误");

            }
        }

        System.out.println(stu);

    }
}



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

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        int length = name.length();
        if (length < 3 || length > 10) {
            //抛出异常
            throw new RuntimeException();
        }
        this.name = name;

    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age < 18 || age > 40) {
            //抛出异常
            throw new RuntimeException();
        }
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}


 四、自定义异常

1、定义异常类:见名知意

2、写继承关系

3、空参构造

4、带参构造

例:引用上一个例题

//创建name错误产生的自定义异常类
public class NameFormatException extends RuntimeException{

    public NameFormatException() {
    }

    public NameFormatException(String message) {
        super(message);
    }
}

//创建age不符合产生的自定义异常类
public class AgeOutOfBoundsException extends RuntimeException{
    public AgeOutOfBoundsException() {
    }

    public AgeOutOfBoundsException(String message) {
        super(message);
    }
}

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

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        int length = name.length();
        if (length < 3 || length > 10) {
            //引用自定义异常类
            throw new NameFormatException(name+"格式有误,长度应该为:3-10");
        }
        this.name = name;

    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age < 18 || age > 40) {
            //引用自定义异常类
            throw new AgeOutOfBoundsException(age+"超出范围");
        }
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}


public class ExceptionDemo2 {
    public static void main(String[] args) {
        /*
        需求:键盘录入学生的姓名和年龄
            姓名的长度在3~10之间
            年龄的范围为18~40岁
            超出这个范围时异常数据不能赋值,需要重新录入,一直到录入正确为止

        提示:需要考虑用户在键盘录入时的所有情况
            比如:录入年龄时超出范围,录入年龄时录入了abc等情况
         */
        Scanner sc = new Scanner(System.in);
        Student stu = new Student();

        while (true) {
            try {
                System.out.println("请输入学生的姓名");
                String name = sc.nextLine();
                stu.setName(name);

                System.out.println("请输入学生的年龄");
                String ageStr = sc.nextLine();
                int age = Integer.parseInt(ageStr);
                stu.setAge(age);

                //如果所有数据都正确,跳出
                break;
            } catch (NumberFormatException | NameFormatException | AgeOutOfBoundsException e) {
                e.printStackTrace();
            }
        }

        System.out.println(stu);

    }
}

//测试结果:
/*
请输入学生的姓名
aaaaaaaaaaaaaaaaaaaaa
com.Exception.NameFormatException: aaaaaaaaaaaaaaaaaaaaa格式有误,长度应该为:3-10
	at com.Exception.Student.setName(Student.java:22)
	at com.Exception.ExceptionDemo2.main(ExceptionDemo2.java:23)
请输入学生的姓名
aaa
请输入学生的年龄
45
com.Exception.AgeOutOfBoundsException: 45超出范围
	at com.Exception.Student.setAge(Student.java:34)
	at com.Exception.ExceptionDemo2.main(ExceptionDemo2.java:28)
请输入学生的姓名
aaa
请输入学生的年龄
23
Student{name = aaa, age = 23}
*/


 觉得有用就点点赞吧~

                     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值