国庆节10月1日
--


嘿,今天咱们聊点“规矩”——不是老板定的KPI,而是代码里那些悄悄帮你兜底的小帮手:枚举让值不再乱跑,注解让意图一目了然,异常让错误不憋着。它们不炫技,但缺了真不行。来,泡杯咖啡,咱们轻松理一理这三件套怎么用得又稳又巧~
需求:创建季节 (Season) 对象。
特点分析:
传统实现的问题:使用普通类定义,虽然可以满足,但无法从语法层面强制限制对象数量和不可变性。
实现步骤(小结):
优点:实现了枚举的功能。
缺点:代码相对繁琐。
1enum Season2 {2 // 1. 将常量对象定义在枚举类的行首,多个常量用逗号间隔,最后用分号结尾。3 SPRING("春天", "温暖"),4 WINTER("冬天", "寒冷"),5 AUTUMN("秋天", "凉爽"),6 SUMMER("夏天", "炎热"); // What() 如果有无参对象,也可以定义7
8 // 2. 定义属性9 private String name;10 private String desc;11
12 // 3. 构造器私有化13 private Season2(String name, String desc) {14 this.name = name;15 this.desc = desc;16 }17 // 可以提供无参构造器18 private Season2() {}19 // ... get方法20}注意事项:
| 方法名 | 说明 |
|---|---|
| toString() | 返回当前枚举对象名。Enum类已重写,子类可重写以返回更友好的信息。 |
| name() | 返回当前枚举对象名(常量名)。不能重写。 |
| ordinal() | 返回当前枚举对象的序号(从0开始)。 |
| values() | 返回该枚举类中所有的常量构成的数组(静态方法,由编译器生成)。 |
| valueOf(String name) | 将字符串转换为对应的枚举对象。字符串必须为已有常量名,否则报 IllegalArgumentException。 |
| compareTo(Enum o) | 比较两个枚举常量的序号(编号)。 |
注解:也被称为元数据 (Metadata),用于修饰解释包、类、方法、属性、构造器、局部变量等数据信息。
与注释的区别:注释是给人看的,注解是给编译器或JVM等工具看的,可以被编译或运行,是嵌入代码中的补充信息。
作用:
使用 @ 符号,将其当成修饰符使用。
作用:限定某个方法是重写父类方法。只能用于方法。
使用说明:
源码分析:
1@Target(ElementType.METHOD) // 表示只能修饰方法2@Retention(RetentionPolicy.SOURCE) // 作用范围:源码阶段,编译后就不存在了3public @interface Override {4}作用:表示某个程序元素(类、方法、字段等)已过时。不推荐使用,但仍可使用。
使用说明:
源码分析:
1@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})2@Retention(RetentionPolicy.RUNTIME) // 运行时仍保留3@Documented // 会被 javadoc 工具提取4public @interface Deprecated { ... }作用:抑制编译器警告。
使用说明:
1@SuppressWarnings({“rawtypes”, “unchecked”, “unused”})元注解是用于修饰其他注解的注解。了解即可,主要用于阅读源码。
作用:指定被修饰的注解可以保留多长时间(即生命周期)。必须指定 value 值。
三种取值:

异常:程序执行过程中发生的不正常情况(语法错误和逻辑错误不属于异常)。
异常体系两大类别:
Error(错误):Java虚拟机无法解决的严重问题,如StackOverflowError(栈溢出)、OutOfMemoryError(OOM)。程序会崩溃,通常无法通过代码处理。
Exception(异常):因编程错误或偶然外在因素导致的一般性问题,可以使用针对性代码进行处理。分为两大类:
1Throwable2├── Error (e.g., StackOverflowError, OutOfMemoryError)3└── Exception4 ├── RuntimeException (运行时异常)5 │ ├── NullPointerException6 │ ├── ArithmeticException7 │ ├── ArrayIndexOutOfBoundsException8 │ ├── ClassCastException9 │ └── NumberFormatException10 └── 其他Exception (编译时异常,e.g., IOException, SQLException)小结:
| 异常类型 | 触发场景 |
|---|---|
| NullPointerException | 试图在需要对象的地方使用 null(如调用 null 对象的方法或属性)。 |
| ArithmeticException | 出现异常的运算条件(如整数“除以零”)。 |
| ArrayIndexOutOfBoundsException | 用非法索引(负索引或大于等于数组长度)访问数组。 |
| ClassCastException | 试图将对象强制转换为不是其实例子类的类型。 |
| NumberFormatException | 试图将格式不正确的字符串转换为数值类型(如 Integer.parseInt(“abc”))。 |
1try {2 // 可能发生异常的代码3} catch (ExceptionType e) {4 // 捕获到异常后的处理逻辑5 // e.getMessage(): 获取异常信息6} finally {7 // 无论是否发生异常,都会执行的代码(通常用于释放资源)8}注意事项与细节:
执行顺序小结:
基本介绍:在方法声明处,用 throws 语句声明该方法可能抛出的异常类型,将异常的处理责任传递给该方法的调用者。
语法:访问修饰符 返回类型 方法名(参数列表) throws 异常类型1, 异常类型2 { … }
注意事项与细节:
当程序中出现特定的错误,但Java标准异常类中没有合适的异常来描述时,可以自定义异常类。
定义类,类名自定义,继承 Exception 或 RuntimeException。
通常提供两个构造器:一个无参构造器,一个带 String message 参数的构造器(用于传递异常信息)。
例如,定义 AgeException,在接收年龄参数时,若范围不在 18-120 之间,则抛出此自定义异常。
1class AgeException extends RuntimeException {2 public AgeException(String message) {3 super(message);4 }5}6// 使用7if(age < 18 || age > 120) {8 throw new AgeException("年龄需要在 18~120 之间");9}| 关键词 | 意义 | 位置 | 后面跟随的东西 |
|---|---|---|---|
| throws | 异常处理的一种方式(声明可能抛出的异常) | 方法声明处 | 异常类型(可以是多个) |
| throw | 手动生成异常对象并抛出的关键字 | 方法体内 | 异常对象(new Exception(…)) |
简单记忆:throws 是声明异常,throw 是抛出异常。
如果你喜欢,那么欢迎来到我的世界!
了解更多暂未播放



"所有的相遇都是久别重逢。"—— 未知


