JAVA学习-异常

一、认识异常

        什么是异常?

                指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止

二、异常体系

        Error:系统级别问题,代码无法控制。

        RuntimeException及其子类:运行时异常,非受检异常,编译阶段不会检查,但是运行时可能会出现的异常。       

        常见的运行时异常有:
                

ArrayIndexOutOfBoundsException   数组角标越界异常

ClassCastException               类型转换异常

NullPointerException             空指针异常

ArithmeticException              算术异常

        除RuntimeException之外所有的异常:编译时异常,受检异常,编译期就强制必须处理的,否则程序不能通过编译。

        编译时异常的作用是什么:

                在编译阶段就警告程序员可能出现的问题, 提醒程序员提前做好应对异常的准备。

异常的处理方式:

        异常的处理方式1-throws:用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理。

//写法一:

方法 throws 异常1 ,异常2 ,异常3 ..{

}

//写法二:

方法 throws Exception{

}

        异常处理方式2-try...catch...finally:监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。

//写法一:

try{
       // 监视可能出现异常的代码!
   }catch(异常类型1 变量){
       // 处理异常
   }catch(异常类型2 变量){
       // 处理异常
   }...
   finally{
     
   //释放资源或其他逻辑
  }
 

//写法二:

try{
    // 可能出现异常的代码!
    }catch (异常类型1 | 异常类型2 e){
        e.printStackTrace(); // 直接打印异常栈信息
    }finally{
         //释放资源或其他逻辑
    }

//写法三:

try{
     // 可能出现异常的代码!
    }catch (Exception e){
         e.printStackTrace(); // 直接打印异常栈信息
    }finally{
         //释放资源或其他逻辑
    }


     

三、自定义异常

        1. 定义一个异常类继承Exception或RuntimeException。

        2. 重写构造器(空参、带参)。

        3. 在出现异常的地方用throw new 自定义对象抛出。

自定义异常案例:       

  1. 定义一个“年龄异常类”:AgeException,使其继承自RuntimeException,并添加无参、String参数的构造方法;

    //自定义异常
    public class AgeException extends RuntimeException{
    
        public AgeException() {
        }
    
        public AgeException(String message) {
            super(message);
        }
    }

  2. 定义一个“性别异常类”:SexException,使其继承自RuntimeException,并添加无参、String参数的构造方法;

    //自定义异常
    public class SexException extends RuntimeException{
        public SexException() {
        }
    
        public SexException(String message) {
            super(message);
        }
    }

  3. 定义一个Student类,属性:姓名、性别、年龄。 在性别的set方法中判断是否是男/女,如果不是则抛出:性别异常 在年龄的set方法中判断年龄是否是15--50之间,如果不是则抛出:年龄异常

    public class Student {
    
        private String name;
        private String gender;
        private int age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            //判断是否是男/女,如果不是则抛出:性别异常
            if(gender.equals("男")||gender.equals("女")){
                this.gender = gender;
            }else {
                throw new SexException("性别异常");
            }
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            //判断年龄是否是15--50之间,如果不是则抛出:年龄异常
            if ((age >= 15)&&(age <= 50)) {
                this.age = age;
            }else throw new AgeException("年龄异常");
        }
    }

  4. 编写测试类,创建一个Student对象,并在try{}中调用setXxx()方法为对象属性赋值,在catch()中打印年龄错误。

import java.util.Scanner;
public class StudentTest {
    public static void main(String[] args) {

        Student student = new Student();
        Scanner scanner = new Scanner(System.in);

        try {
            System.out.println("请输入姓名:");
            String name = scanner.next();
            student.setName(name);
            System.out.println("请输入性别:");
            String gender = scanner.next();
            student.setGender(gender);
            System.out.println("请输入年龄:");
            int age = scanner.nextInt();
            student.setAge(age);

            System.out.println("输入的信息为"+name+"、"+gender+"、"+age);

        } catch (AgeException e) {
            throw new AgeException("年龄错误");
        }


    }
}

#学无止尽    #记录并分享我的学习日常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南枫知我意~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值