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、自定义异常
- 自定义类:自定义异常类名(程序员自己写)继承Exception或RuntimeException
- 如果继承Exception,属于编译异常
- 如果继承RuntimeException,属于运行异常(一般来说,都会继承RuntimeException)
- 为什么继承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);
}
}