当前位置: 首页 > news >正文

Java中的异常,枚举,泛型,代理

一、Java 异常(Exception)

异常是程序运行时出现的意外情况,Java 通过异常处理机制增强程序的健壮性。

1. 异常体系结构
  • 顶层父类Throwable
    • Error:严重错误(如OutOfMemoryError),程序无法处理,通常无需捕获
    • Exception:可处理的异常
      • 受检异常(Checked Exception):编译期检查,必须处理(如IOException
      • 非受检异常(Unchecked Exception):运行时异常,可选择性处理(如NullPointerException
2. 异常处理关键字
  • try:包裹可能发生异常的代码块
  • catch:捕获并处理指定类型的异常
  • finally:无论是否发生异常,都会执行的代码块(常用于资源释放)
  • throw:手动抛出异常
  • throws:声明方法可能抛出的异常
3. 示例代码

java

运行

public class ExceptionDemo {public static void main(String[] args) {try {int result = divide(10, 0);System.out.println(result);} catch (ArithmeticException e) {System.out.println("捕获异常:" + e.getMessage());} finally {System.out.println("无论是否异常都会执行");}}public static int divide(int a, int b) throws ArithmeticException {if (b == 0) {throw new ArithmeticException("除数不能为0");}return a / b;}
}
4. 自定义异常

通过继承Exception(受检)或RuntimeException(非受检)实现:

java

运行

class CustomException extends RuntimeException {public CustomException(String message) {super(message);}
}

二、Java 枚举(Enum)

枚举是一种特殊的类,用于定义固定数量的常量集合(如季节、星期等)。

1. 基本特性
  • 枚举类默认继承java.lang.Enum,不能继承其他类
  • 枚举常量是枚举类的实例,默认被public static final修饰
  • 枚举类可以有构造器、方法和属性,但构造器必须是私有(private)的
2. 基本用法

java

运行

// 简单枚举
enum Season {SPRING, SUMMER, AUTUMN, WINTER
}// 带属性和方法的枚举
enum Weekday {MONDAY("周一", 1),TUESDAY("周二", 2);private final String chineseName;private final int index;// 私有构造器Weekday(String chineseName, int index) {this.chineseName = chineseName;this.index = index;}// 自定义方法public String getChineseName() {return chineseName;}
}
3. 常用方法
  • values():返回枚举常量数组
  • valueOf(String name):根据名称获取枚举常量
  • ordinal():返回枚举常量的序号(从 0 开始)
4. 应用场景
  • 状态标识(如订单状态:待支付、已支付、已取消)
  • 有限选项(如性别:男、女)
  • 替代常量定义(比public static final更安全)

三、Java 泛型(Generics)

泛型允许在定义类、接口和方法时使用类型参数,实现代码复用和类型安全。

1. 核心作用
  • 类型安全:编译期检查类型,避免运行时ClassCastException
  • 代码复用:同一套逻辑支持多种数据类型
  • 消除强制类型转换:提高代码可读性
2. 基本用法

泛型类

java

运行

class Box<T> {  // T为类型参数private T value;public void setValue(T value) {this.value = value;}public T getValue() {return value;}
}// 使用
Box<String> stringBox = new Box<>();
stringBox.setValue("Hello");
String str = stringBox.getValue();  // 无需强制转换

泛型方法

java

运行

public class GenericMethod {// 泛型方法,E为类型参数public static <E> void printArray(E[] array) {for (E element : array) {System.out.print(element + " ");}}public static void main(String[] args) {Integer[] intArray = {1, 2, 3};String[] strArray = {"a", "b", "c"};printArray(intArray);  // 自动推断类型printArray(strArray);}
}

泛型接口

java

运行

interface Generator<T> {T generate();
}class NumberGenerator implements Generator<Integer> {@Overridepublic Integer generate() {return (int)(Math.random() * 100);}
}
3. 通配符
  • <?>:无界通配符,表示任意类型
  • <? extends T>:上界通配符,表示 T 及其子类
  • <? super T>:下界通配符,表示 T 及其父类

java

运行

// 只能读取,不能添加(除null外)
public void printList(List<? extends Number> list) {for (Number n : list) {System.out.println(n);}
}// 只能添加T及其子类,读取时只能当作Object
public void addNumbers(List<? super Integer> list) {list.add(1);list.add(2);
}
4. 类型擦除

Java 泛型采用编译期类型擦除机制,运行时不保留泛型类型信息,会被替换为原始类型(如T被替换为Object)。

四、Java 代理(Proxy)

代理模式是一种设计模式,通过代理对象控制对目标对象的访问,Java 提供动态代理机制。

1. 代理类型
  • 静态代理:编译期生成代理类,手动编写代理逻辑
  • 动态代理:运行时动态生成代理类,无需手动编写
2. 静态代理示例

java

运行

// 接口
interface UserService {void save();
}// 目标类
class UserServiceImpl implements UserService {@Overridepublic void save() {System.out.println("执行保存操作");}
}// 代理类
class UserServiceProxy implements UserService {private UserService target;public UserServiceProxy(UserService target) {this.target = target;}@Overridepublic void save() {System.out.println("前置处理:开启事务");target.save();  // 调用目标方法System.out.println("后置处理:提交事务");}
}// 使用
public class StaticProxyDemo {public static void main(String[] args) {UserService target = new UserServiceImpl();UserService proxy = new UserServiceProxy(target);proxy.save();  // 通过代理调用}
}
3. 动态代理(JDK 代理)

基于接口实现,通过java.lang.reflect.ProxyInvocationHandler实现:

java

运行

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;// InvocationHandler实现类
class LogHandler implements InvocationHandler {private Object target;  // 目标对象public LogHandler(Object target) {this.target = target;}// 代理逻辑@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("日志:调用方法前");Object result = method.invoke(target, args);  // 调用目标方法System.out.println("日志:调用方法后");return result;}
}// 使用动态代理
public class DynamicProxyDemo {public static void main(String[] args) {UserService target = new UserServiceImpl();// 创建代理对象UserService proxy = (UserService) Proxy.newProxyInstance(target.getClass().getClassLoader(),  // 类加载器target.getClass().getInterfaces(),   // 实现的接口new LogHandler(target)               // 代理逻辑处理器);proxy.save();  // 通过代理调用}
}
4. 应用场景
  • AOP(面向切面编程):如日志、事务、权限控制
  • 远程调用:如 RPC 框架通过代理实现网络通信
  • 延迟加载:代理对象在真正需要时才初始化目标对象
5. CGLIB 代理

JDK 代理要求目标类实现接口,CGLIB(Code Generation Library)通过继承目标类生成代理类,可代理无接口的类(需引入第三方库)。

总结:异常处理保障程序稳定性,枚举增强常量定义的安全性,泛型实现类型安全的代码复用,代理模式实现对目标对象的增强和控制,这些特性共同构成了 Java 语言的强大功能。

http://www.xdnf.cn/news/1414909.html

相关文章:

  • 单表查询-group by rollup优化
  • 责任链模式实践-开放银行数据保护及合规
  • 一键获取电商平台商品原数据:item_get_app接口实操讲解
  • [Plecs基础知识系列]建立自定义模块/子系统(Subsystem)
  • 基于路测点云标注生成OpenDrive地图的全流程解析
  • 微服务01
  • Spring Cloud Alibaba Seata 分布式事务(六)
  • 索引性能分析
  • 【开题答辩全过程】以 基于SSM的拾光咖啡厅管理系统的设计与实现为例,包含答辩的问题和答案
  • Nano Banana:下一代AI图像创作与编辑指南
  • Linux网络编程04:网络基础(万字图文解析)
  • AFSIM仿真脚本生成(三)脚本解析技术加速验证过程
  • 有关指针的认知盲区:指针大小,决定因素,指针变量
  • EtherCAT主站IGH-- 44 -- IGH之slave_config.h/c文件解析
  • 目标检测算法YOLOv4详解
  • Langchain指南-关键特性:使用聊天模型调用工具
  • 用 MATLAB 实现遗传算法求解一元函数极值:从代码到实践
  • STL常见容器介绍
  • 从RNN到Transformer
  • @Transactional如何对分布式事务生效
  • Redis实现短信登录
  • 需要固定一个指针,再遍历另一个指针的都可以用双指针方法
  • 【系列11】端侧AI:构建与部署高效的本地化AI模型 第10章:LLM端侧部署
  • 二.Shell脚本编程
  • 在AlmaLinux或CentOS 8上编译安装ZLMediaKit流媒体服务器
  • CatBoost vs XGBoost:两大Boosting框架的全面对比
  • HTML5国庆网站源码
  • gdsfactory安装以及和klayout联调
  • 自学嵌入式第三十一天:Linux系统编程-进程间通信
  • 《程序员修炼之道》第七八九章读书笔记