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
检查,增强了代码的可读性和安全性。