2024-07-03
记忆是痛苦的根源。 --- 《功夫》 · acheing
ExceptionHandler & try...catch
今天在写代码的时候,遇到一个处理异常的场景,在已经有了 ExceptionHandler 的情况下,在代码中通过 try...catch 可以捕获到exception吗?
可以捕获
全局的ExceptionHandler主要是针对那些未在方法内部捕获的异常
-
a方法抛出BussinessException:
public void a() throws BussinessException {
// 业务逻辑,可能抛出BussinessException
throw new BussinessException("业务异常信息");
} -
b方法中捕获Exception:
public void b() {
try {
a(); // 调用a方法
} catch (Exception e) {
// 捕获到异常
System.out.println("捕获到异常: " + e.getMessage());
}
}
在这个示例中,当调用b方法时,a方法会抛出一个BussinessException。在b方法中,由于使用了try-catch块并捕获了Exception,所以BussinessException会被捕获,因为BussinessException是Exception的子类。
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 这个类,记录一下。
核心功能
-
创建
Optional对象:Optional类提供了几种静态方法来创建Optional对象:Optional.of(T value):创建一个包含指定值的Optional对象,如果传入的值为null,则抛出NullPointerException。Optional.ofNullable(T value):创建一个可能包含null值的Optional对象。Optional.empty():创建一个空的Optional对象。
-
检查值是否存在:
isPresent():如果值存在,返回true,否则返回false。ifPresent(Consumer<? super T> consumer):如果值存在,则执行指定的操作,否则不执行任何操作。
-
获取值:
get():返回包含的值,如果值不存在则抛出NoSuchElementException。orElse(T other):如果值存在,返回该值,否则返回指定的默认值。orElseGet(Supplier<? extends T> other):如果值存在,返回该值,否则返回由指定的Supplier提供的值。orElseThrow(Supplier<? extends X> exceptionSupplier):如果值存在,返回该值,否则抛出由指定的Supplier提供的异常。
-
过滤和转换:
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 检查,增强了代码的可读性和安全性。