Optional.ofNullable().orElseThrow() 代码实例
时间: 2023-07-26 10:29:56 浏览: 130
好的,下面是一个使用 Optional.ofNullable().orElseThrow() 的示例:
假设有一个函数 getUserById(int id),它返回一个 User 对象,如果找不到对应的用户,则返回 null。我们可以使用 Optional.ofNullable().orElseThrow() 来获取 User 对象,如果 User 对象为空,就抛出一个异常。
```
User user = Optional.ofNullable(getUserById(123))
.orElseThrow(() -> new UserNotFoundException("User not found!"));
```
上面的代码中,如果 getUserById(123) 返回一个非空的 User 对象,那么它的值会被赋给 user 变量。如果 User 对象为空,就会抛出一个自定义的 UserNotFoundException 异常,并且异常消息为 "User not found!"。
这样,我们就可以使用 Optional.ofNullable().orElseThrow() 来避免在使用可能为空的对象时出现空指针异常,并且能够在对象为空时,抛出一个自定义的异常,方便我们进行错误处理。
相关问题
@Override public StudentEntity studentLogin(String username, String password) throws BusinessCodeException { BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); StudentEntity studentEntity = loginMapper.studentLogin(username); Optional.ofNullable(studentEntity).orElseThrow(() -> { return new BusinessCodeException(BusinessCode.USER_LOGIN_FAILURE.getMsg(), BusinessCode.USER_LOGIN_FAILURE.getCode()); }); return bCryptPasswordEncoder.matches(password, studentEntity.getPwd()) ? studentEntity : null; }
这是一个Java代码片段,其中实现了一个名为`studentLogin`的方法,该方法接收用户名和密码作为参数,并返回一个`StudentEntity`实例。具体解释如下:
- `@Override`:是Java中的注解,表示这个方法是覆盖了父类或接口中的同名方法。
- `public StudentEntity studentLogin(String username, String password) throws BusinessCodeException`:是一个公共方法,它的返回值类型是`StudentEntity`,即一个具体的实体类。这个方法接收两个参数,分别是用户名和密码。在方法实现中可能会抛出`BusinessCodeException`异常。
- `BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();`:是创建了一个`BCryptPasswordEncoder`实例,用于对密码进行加密和验证。
- `StudentEntity studentEntity = loginMapper.studentLogin(username);`:是调用了一个名为`studentLogin`的方法,该方法返回一个`StudentEntity`实例。`loginMapper`是一个可能通过依赖注入得到的Mapper对象,用于访问数据库。
- `Optional.ofNullable(studentEntity).orElseThrow(() -> { return new BusinessCodeException(BusinessCode.USER_LOGIN_FAILURE.getMsg(), BusinessCode.USER_LOGIN_FAILURE.getCode()); });`:是使用了Java 8中的Optional类,对`studentEntity`进行了非空判断。如果`studentEntity`为`null`,则抛出一个`BusinessCodeException`异常,异常信息为`USER_LOGIN_FAILURE`。
- `return bCryptPasswordEncoder.matches(password, studentEntity.getPwd()) ? studentEntity : null;`:是对用户输入的密码进行验证,如果密码正确,则返回`studentEntity`实例,否则返回`null`。在这里,使用了`BCryptPasswordEncoder`对数据库中存储的密码进行解密和比较。如果密码一致,则返回`studentEntity`实例,否则返回`null`。
因此,这段代码的作用是实现了一个学生登录的功能,它通过用户名和密码查询数据库中的学生信息,并对用户输入的密码进行验证,如果密码正确,则返回学生实体对象;否则返回`null`。如果查询结果为空,则抛出一个业务异常。
orElseThrow()抛出的异常必须是空指针异常类或者空指针异常的子类吗?可以是自定义的类吗?如果我先使用Optional.ofNullable()规避了空指针异常后,我在orElseThrow()传入的参数是其他的异常, 可以吗
`orElseThrow()` 方法的参数可以是任何类型的异常,不限于空指针异常类或其子类。你完全可以传入自定义的异常类作为参数。
`orElseThrow()` 方法接受一个 `Supplier` 函数接口作为参数,用于在需要时创建并抛出异常。`Supplier` 函数接口表示一个供应商,它不接受任何参数,返回一个结果。在这种情况下,它用于提供异常对象。
以下是一个示例代码,演示了如何在 `orElseThrow()` 方法中使用自定义异常类:
```java
import java.util.Optional;
public class Example {
public static void main(String[] args) {
String value = null;
try {
String result = Optional.ofNullable(value)
.orElseThrow(() -> new MyCustomException("Value cannot be null"));
System.out.println(result);
} catch (MyCustomException e) {
System.out.println("Caught exception: " + e.getMessage());
}
}
}
class MyCustomException extends Exception {
public MyCustomException(String message) {
super(message);
}
}
```
在上述代码中,我们创建了一个空值的字符串 `value`。然后,我们使用 `Optional.ofNullable(value)` 将其封装到一个 `Optional` 对象中。
接着,我们在 `orElseThrow()` 方法中使用 `Supplier` lambda 表达式创建并抛出一个自定义异常类 `MyCustomException` 的实例。
如果 `value` 为空,则会抛出 `MyCustomException` 异常,并在 catch 块中捕获该异常并输出相应的消息。
所以,你可以在 `orElseThrow()` 方法中传入任何类型的异常类,包括自定义的异常类,以满足你的需求。
阅读全文