問:MySQL查詢結果為空時會不會報錯?
@GetMapping("test")
public void test(String id) {
User user = userService.getUserById(id);
System.out.println("user: " + user);
}
根據id查詢得到user,當user不存在時,列印結果如下:
user: null
當user存在時,列印結果如下:
user: User(id=3, ..., createdDate=2021-04-21 00:00:17.0, updatedDate=2021-04-21 00:00:17.0, is_deleted=false)
結論:MySQL查詢結果可以為空,并且不會報錯。
問:MySQL查詢結果為空,何時會報錯?
@GetMapping("test")
public void test(String id) {
User user = userService.getUserById(id);
System.out.println("user: " + user);
System.out.println("id: " + user.getId());
}
當user存在時,列印結果如下:
user: User(id=3, ..., createdDate=2021-04-21 00:00:17.0, updatedDate=2021-04-21 00:00:17.0, is_deleted=false)
id: 3
根據id查詢得到user,當user不存在時,列印結果如下:
user: null

使用Swagger測試時,直接報錯如上。
結論:空對象無法擷取屬性值!
問:MySQL查詢結果為空時,.java 抛出異常資訊,如何顯示?
@Override
public void validateUser(String id) {
if (null == userMapper.getUserById(id)) {
throw new GlobalException(MessageConstant.INVALID_USER);
}
}
.java直接抛出異常,這是内部抛出異常資訊,頁面顯示如下:
對于使用者而言,看不懂異常資訊,會直接認為是系統報錯!
問:發生異常時,封裝異常資訊實作方式一
*Controller.java
@GetMapping("test")
public GlobalException test() {
return new GlobalException(MessageConstant.FAIL_FIND_USER);
}
GlobalException.java
@Data
@NoArgsConstructor
public class GlobalException extends RuntimeException {
private static final long serialVersionUID = 1L;
private String msg;
private int code = 500;
public GlobalException(String msg) {
super(msg);
this.msg = msg;
}
}
發生異常時,抛出資訊如下:
{
"cause": null,
"stackTrace": [
.... ,
{
"methodName": "run",
"fileName": "Thread.java",
"lineNumber": 748,
"className": "java.lang.Thread",
"nativeMethod": false
}
],
"msg": "Fail to find user",
"code": 500,
"localizedMessage": "Fail to find user",
"message": "Fail to find user",
"suppressed": []
}
異常資訊内容過多,大概有250行左右。
問:發生異常時,封裝異常資訊實作方式二
- ResponseResult.java
@Data
public class ResponseResult<T> {
private final Integer code;
private final String message;
private final T data;
...
public static <T> ResponseResult<T> success(T data) {
return new ResponseResult<>(ResultStatusType.SUCCESS, data);
}
public static <T> ResponseResult<T> failure(ResultStatusType resultStatusType, String message, T data) {
return new ResponseResult<>(resultStatusType, message, data);
}
}
- ResultStatusType.java
@Getter
public enum ResultStatusType {
SUCCESS(0, "OK"),
BAD_REQUEST(HttpStatus.BAD_REQUEST.value(), "Bad Request"),
INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Internal Server Error"),
;
private final Integer code;
private final String message;
ResultStatusType(Integer code, String message) {
this.code = code;
this.message = message;
}
}
- UserController.java
@GetMapping("test")
public ResponseEntity<ResponseResult<String>> test(String id) {
User user = userService.getUserById(id);
if (user != null) {
return new ResponseEntity<>(ResponseResult.success(MessageConstant.SUCCESS), HttpStatus.OK);
} else {
return new ResponseEntity<>(ResponseResult.failure(ResultStatusType.INTERNAL_SERVER_ERROR, MessageConstant.FAIL_FIND_USER, null), HttpStatus.BAD_REQUEST);
}
}
對象為空時,傳回結果如下: