11-枚举+注解+异常

1、枚举

1.1、引出枚举

创建Season对象,特点如下:

  • 季节的值是有限的几个值
  • 只读,不需要修改
package com.lhj.enum_;

/**
 * @Author: lihaojie
 * @Description:
 * @DateTime: 2023/9/16 16:45
 **/
public class Enumeration01 {
    public static void main(String[] args) {
        Season spring = new Season("春天", "温暖");
        Season summer = new Season("夏天", "炎热");
        Season autumn = new Season("秋天", "凉爽");
        Season winter = new Season("冬天", "寒冷");
        // 因为对于季节而言 它的对象(具体值)是固定的4个 不会有更多
        // 按照这个思路 不能体现季节是固定的4个对象
        Season hong = new Season("x天", "xx");
    }
}
class Season {
    private String name;
    private String desc;

    public Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
}

1.2、枚举详述

  • 是一组常量的集合
  • 属于一种特殊的类,里面只包含一组有限的特定的对象

1.3、自定义枚举类

步骤:

  • 构造器私有化,防止别人直接new对象
  • 去掉set方法,防止属性被修改
  • 在类中创建固定的对象,用public static final修饰(final往往和static搭配使用,效率更高,不会导致类加载,底层编译器做了优化处理)
package com.lhj.enum_;

/**
 * @Author: lihaojie
 * @Description:
 * @DateTime: 2023/9/16 17:01
 **/
public class Enumeration02 {
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
        System.out.println(Season.SUMMER);
        System.out.println(Season.AUTUMN);
        System.out.println(Season.WINTER);
    }
}

// 演示自定义枚举实现
class Season {
    private String name;
    private String desc; // 描述

    // 3、在Season内部创建固定的对象
    // 定义了四个对象 final的好处 --> final往往和static搭配使用,效率更高,不会导致类加载,底层编译器做了优化处理
    public static final Season SPRING = new Season("春天", "温暖");
    public static final Season SUMMER = new Season("夏天", "炎热");
    public static final Season AUTUMN = new Season("秋天", "凉爽");
    public static final Season WINTER = new Season("冬天", "寒冷");

    // 1、将构造器私有化 防止直接new
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    // 2、去掉set方法 防止属性被修改
   /* public void setName(String name) {
        this.name = name;
    }*/
    public String getDesc() {
        return desc;
    }
    // 2、去掉set方法 防止属性被修改
    /*public void setDesc(String desc) {
        this.desc = desc;
    }*/



}

1.4、使用关键字Enum实现枚举

 /**
  * ①:使用enum替代class
  * ②:public static final Season SPRING = new Season("春天", "温暖"); 使用 SPRING("春天", "温暖"); 替代 相当于简化了
  * ③:如果有多个常量(对象),使用逗号间隔
  * ④:如果使用enum实现枚举,要求将定义常量对象,写在最前面
  */
package com.lhj.enum_;

/**
 * @Author: lihaojie
 * @Description:
 * @DateTime: 2023/9/16 17:21
 **/
public class Enumeration03 {
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
        System.out.println(Season.SUMMER);
        System.out.println(Season.AUTUMN);
        System.out.println(Season.WINTER);
    }
}
// 演示自定义枚举实现
enum  Season {
    // 3、在Season内部创建固定的对象
    // 定义了四个对象 final的好处 --> final往往和static搭配使用,效率更高,不会导致类加载,底层编译器做了优化处理
   /* public static final Season SPRING = new Season("春天", "温暖");
    public static final Season SUMMER = new Season("夏天", "炎热");
    public static final Season AUTUMN = new Season("秋天", "凉爽");
    public static final Season WINTER = new Season("冬天", "寒冷");*/

   // 3、使用enum实现枚举
    /**
     * ①:使用enum替代class
     * ②:public static final Season SPRING = new Season("春天", "温暖"); 使用 SPRING("春天", "温暖"); 替代 相当于简化了
     * ③:如果有多个常量(对象),使用逗号间隔
     * ④:如果使用enum实现枚举,要求将定义常量对象,写在最前面
     */
   SPRING("春天", "温暖"),
   SUMMER("夏天", "炎热"),
   AUTUMN("秋天", "凉爽"),
   WINTER("冬天", "寒冷");

    // 1、将构造器私有化 防止直接new
    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    private String name;
    private String desc; // 描述

    public String getName() {
        return name;
    }

    // 2、去掉set方法 防止属性被修改
   /* public void setName(String name) {
        this.name = name;
    }*/
    public String getDesc() {
        return desc;
    }
    // 2、去掉set方法 防止属性被修改
    /*public void setDesc(String desc) {
        this.desc = desc;
    }*/
}

1.5、enum关键字实现枚举注意事项

  • 当我们使用enum关键字开发一个枚举类时,默认会继承Enum类
  • 传统的public static final Season SPRING = new Season("春天","温暖"); 简化成SPRING("春天","温暖"); 这里必须知道,它调用的是哪个构造器
  • 如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略
  • 当有多个枚举对象时,使用,间隔,最后一个分号结尾
  • 枚举对象必须放在枚举类的行首
package com.lhj.enum_;

enum Season {
    SPRING("春天", "温暖"),
    SUMMER("夏天", "炎热"),
    AUTUMN("秋天", "凉爽"),
    WINTER("冬天", "寒冷");

    private String name;
    private String desc;

    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return this.name;
    }

    public String getDesc() {
        return this.desc;
    }
}

将上面的代码反编译:

1.6、Enum的常用方法

package com.lhj.enum_;

/**
 * @Author: lihaojie
 * @Description: 演示Enum类的各种方法的使用
 * @DateTime: 2023/9/18 9:58
 **/
public class EnumMethod {
    public static void main(String[] args) {
        Season autumn = Season.AUTUMN;

        System.out.println(autumn.name()); // name方法 输出枚举对象的名称

        System.out.println(autumn.ordinal()); // ordinal方法 输出该枚举对象的次序(从0开始)

        for (Season value : Season.values()) { // values方法 返回Season数组 含有定义的所有枚举对象
            /**
             * SPRING
             * SUMMER
             * AUTUMN
             * WINTER
             */
            System.out.println(value);
        }

        // valueOf方法 将字符串转换成枚举对象 要求字符串必须是已有的变量名 否则会报异常
        Season autumn1 = Season.valueOf("AUTUMN");
        System.out.println(autumn1);
        // Exception in thread "main" java.lang.IllegalArgumentException: No enum constant com.lhj.enum_.Season.JQKA
        // Season autumn2 = Season.valueOf("JQKA");

        // compareTo方法 比较两个枚举常量,比较的是编号
        // 返回 前者的编号-后者的编号
        System.out.println(Season.SUMMER.compareTo(Season.WINTER)); // 2 - 4 = -2

    }
}

1.7、枚举细节

2、注解

2.1、SuppressWarnings

2.2、元注解

3、异常

3.1、引出异常

package com.lhj.exception;

/**
 * @Author: lihaojie
 * @Description:
 * @DateTime: 2023/9/18 14:17
 **/
public class Exception01 {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 0;
        // 1.当执行到num1/num2时 num2 = 0 就会抛出异常 ArithMaticException
        // 2.当抛出异常后 程序就退出 下面的代码就不会执行
        // 3.这样的程序好吗?不好 不应该出现了一个不算致命的问题,就导致整个系统崩溃 java设计者提供了异常处理机制来解决这个问题
        // 4.解决方案 - 异常捕获 : 如果程序员认为一段代码可能会出现问题 可以使用trycatch异常处理机制来解决问题
        // 5.从而保证程序的健壮性
        // 6.将该代码块选中 输入快捷键 ctrl + alt + t
        // 7.如果进行异常处理 即使出现了异常 程序也可以继续执行
        try {
            int res = num1 / num2;
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        System.out.println("程序正在运行...");
    }
}

3.2、异常介绍

  • java中,将程序执行中发生的不正常的情况称为“异常”
  • 执行过程中所发生的异常事件可分为两大类
    • Error(错误) : Java虚拟机无法解决的严重问题,如:JVM系统内部错误,资源耗尽等严重情况,比如:StackOverFlow 和 OOM
    • Exception : 其他因为编程错误或者偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针,试图读取不存在的文件,
    • 网络连接中断等 Exception分为两大类:运行时异常和编译时异常
      • 运行时异常:是指在程序运行时发生的异常
      • 编译时异常:是在编程时,编译器检测出的异常

3.3、异常体系图

3.4、异常处理的方式

try-catch-finally

程序员在代码中捕获发生的异常,自行处理

throws

将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者是JVM

3.5、自定义异常

  1. 自定义类:自定义异常类名(程序员自己写)继承Exception或RuntimeException
  2. 如果继承Exception,属于编译异常
  3. 如果继承RuntimeException,属于运行异常(一般来说,都会继承RuntimeException)
  4. 为什么继承RuntimeException,这样我们就可以使用默认的处理机制

示例:

  • 自定义异常 CustomException.java
  • 当我们接收Person对象年龄时,要求范围在 18~120 之间,否则抛出一个自定义异常(要求继承RuntimeException),并给出提示信息
package exception;

public class CustomException {
    public static void main(String[] args) {
        int age = 18;
        // 要求范围在 18 - 120 之间 否则抛出一个自定义异常
        if (!(age >= 18 && age <= 120)) {
            throw new AgeException("年龄需要在18-120之间");
        }
        System.out.println("你的年龄输入正确");
    }
}
// 自定义异常
class AgeException extends RuntimeException {
    public AgeException(String message) {
        super(message);
    }
}

 3.6、throw和throws的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值