1.查询类方法,如果返回值可能为 `null` 应该返回 `Optional<T>`
例如:
```java
public static Optional<String> getUserName(String userId) {
if ("admin".equals(userId)) {
return Optional.of("admin");
}
return Optional.empty();
}
```

2.无法继续进行后续业务处理,抛出业务异常
例如:
```java
/**
* 传入userId返回金额
* @param userId
* @return
*/
public static int duBusiness(String userId) throws Exception {
if (userId == null) {
throw new Exception("空的用户id");
}
return 8;
}


public static int duBusiness2(String userId) throws Exception {
User user = service.getUserById(userId);
if (user == null) {
throw new Exception("没有查询到该用户");
}
return 8;
}

public void updateBalance(String userId,Long balance) throws Exception{
int row = service.updateId(userId,balance);
if (row != 1){
throw new Exception("更新余额失败");
}
}
```

3.对于明确确不允许抛出异常的方法,使用 `try cacth ` 完整包裹

```java
public void synchronizeToExternal(Map data){
try{
dataRow = service.getById(data);
xxxxx
xxxxx
}catch (Exception e){
log.error("同步xxx失败",e);
}
}

public Result synchronizeToExternal(Map data){
try{
dataRow = service.getById(data);
xxxxx
xxxxx
Result.ok("同步成功")
}catch (Exception e){
log.error("同步xxx失败",e);
Result.err("同步失败")
}
}
```

 

```
protected Result<String> getDownloadUrl(String id){
try {
final String downloadUrlByZ = getDownloadUrlByZ(id);
return Result.success(downloadUrlByZ);
}catch (Exception e){
log.err("1111",e);
return Result.err("查询失败,原因:{}","1111");
}
}

protected String getDownloadUrlByZ(String id) throws Exception {
if(id == null){
throw new Exception("传入id为空");
}
if (id == "2"){
throw new Exception("暂未未回传文件");
}
return "http://xxxxxx.com/xxx.pdf";
}
```


### 什么时候才**必须**抛出异常:
当前系统状态无法处理后续代码的情况下,应该抛出异常,比如
1.查询要更新的数据为null
2.数据格式无法处理或者数据过大
3.返回值为数值可能导致调用者计算错误的情况,应该抛出异常


总结:我们要么确保一定给调用方返回一个正确的值,要么在计算不出正确的值时,什么都不返回。这就是需要抛出异常机制的时候了。

 

公用result 类可做如下构造函数

```java

public static Result err(String msgPrefix, Exception e) {
String msgContent = msgPrefix + ",附加信息:";
if (e instanceof BizException) {
return new Result("500", msgContent + e.getMessage());
}
return new Result("500", msgContent + "系统异常");
}


```

 

按下没一个键盘按钮之前应该三思,敲下每一行,应该回头看,提交前应该再三检查,部署后应该再三测试。