跳到主要内容

2024-07-03

一言

记忆是痛苦的根源。 --- 《功夫》 · acheing


ExceptionHandler & try...catch

今天在写代码的时候,遇到一个处理异常的场景,在已经有了 ExceptionHandler 的情况下,在代码中通过 try...catch 可以捕获到exception吗?

可以捕获

知识点

全局的ExceptionHandler主要是针对那些未在方法内部捕获的异常

  1. a方法抛出BussinessException

    public void a() throws BussinessException {
    // 业务逻辑,可能抛出BussinessException
    throw new BussinessException("业务异常信息");
    }
  2. b方法中捕获Exception

    public void b() {
    try {
    a(); // 调用a方法
    } catch (Exception e) {
    // 捕获到异常
    System.out.println("捕获到异常: " + e.getMessage());
    }
    }

在这个示例中,当调用b方法时,a方法会抛出一个BussinessException。在b方法中,由于使用了try-catch块并捕获了Exception,所以BussinessException会被捕获,因为BussinessExceptionException的子类。

public void b() {
try {
a(); // 调用a方法
} catch (BussinessException e) {
// 这里也可以捕获到具体的BussinessException
System.out.println("捕获到业务异常: " + e.getMessage());
} catch (Exception e) {
// 这里捕获所有Exception的子类
System.out.println("捕获到异常: " + e.getMessage());
}
}

这样做可以使异常处理更加细化,先捕获具体的异常类型,然后再捕获所有其他的异常。

总结:在b方法中,可以通过try-catch块捕获到a方法抛出的BussinessException。即使有全局的ExceptionHandler来处理BussinessException,也不会影响到b方法中捕获异常的能力。全局的ExceptionHandler主要是针对那些未在方法内部捕获的异常。

Optional 是 Java 8 引入的一个容器类,用于解决可能出现的 null 值问题,从而避免 NullPointerException。它提供了一种更优雅的方式来处理可能为空的值。下面是对 Optional 类的详细介绍:

Optional

没怎么用过 Optional 这个类,记录一下。

核心功能

  1. 创建 Optional 对象Optional 类提供了几种静态方法来创建 Optional 对象:

    • Optional.of(T value):创建一个包含指定值的 Optional 对象,如果传入的值为 null,则抛出 NullPointerException
    • Optional.ofNullable(T value):创建一个可能包含 null 值的 Optional 对象。
    • Optional.empty():创建一个空的 Optional 对象。
  2. 检查值是否存在

    • isPresent():如果值存在,返回 true,否则返回 false
    • ifPresent(Consumer<? super T> consumer):如果值存在,则执行指定的操作,否则不执行任何操作。
  3. 获取值

    • get():返回包含的值,如果值不存在则抛出 NoSuchElementException
    • orElse(T other):如果值存在,返回该值,否则返回指定的默认值。
    • orElseGet(Supplier<? extends T> other):如果值存在,返回该值,否则返回由指定的 Supplier 提供的值。
    • orElseThrow(Supplier<? extends X> exceptionSupplier):如果值存在,返回该值,否则抛出由指定的 Supplier 提供的异常。
  4. 过滤和转换

    • filter(Predicate<? super T> predicate):如果值存在并且满足指定的条件,返回包含该值的 Optional,否则返回一个空的 Optional
    • map(Function<? super T,? extends U> mapper):如果值存在,应用提供的函数,并返回包含结果的 Optional,否则返回一个空的 Optional
    • flatMap(Function<? super T,Optional<U>> mapper):与 map 类似,但映射的结果必须是 Optional

示例代码

import java.util.Optional;

public class OptionalExample {
public static void main(String[] args) {
// 创建Optional对象
Optional<String> optional = Optional.of("Hello");

// 检查值是否存在
if (optional.isPresent()) {
System.out.println("Value is present: " + optional.get());
} else {
System.out.println("Value is not present");
}

// 使用orElse提供默认值
String value = optional.orElse("Default Value");
System.out.println("Value: " + value);

// 使用map转换值
Optional<String> upperCase = optional.map(String::toUpperCase);
upperCase.ifPresent(System.out::println);

// 使用flatMap
Optional<String> flatMapped = optional.flatMap(v -> Optional.of(v + " World"));
flatMapped.ifPresent(System.out::println);
}
}

参考资料

Optional 类提供了一种优雅的方式来处理可能为空的值,避免了传统的 null 检查,增强了代码的可读性和安全性。