1

我有一个 java 代码,我在其中调用数据库函数进行数据插入。函数可能会根据数据库中的异常返回错误代码。为了在屏幕上显示这些错误,我编写了下面的代码。

String DBerrorCode=DatabaseReturnErrorCode;//Errorcode from Database

if("RUREF00001".equals(DBerrorCode)){
    throw new DataUpdateException(ErrorRUREF00001);
}else if("RUREF00002".equals(DBerrorCode)){
    throw new DataUpdateException(ErrorRUREF00002);
} else if("RUREF00003".equals(DBerrorCode)){
    throw new DataUpdateException(ErrorRUREF00003);
} else if("RUREF00004".equals(DBerrorCode)){
    throw new DataUpdateException(ErrorRUREF00004);
} else if("RUREF00005".equals(DBerrorCode)){
    throw new DataUpdateException(ErrorRUREF00005);
} else if("RUREF00006".equals(DBerrorCode)){
    throw new DataUpdateException(ErrorRUREF00006);
} else if("RUREF00027".equals(DBerrorCode)){
    throw new DataUpdateException(ErrorRUREF00027);
} else if("RUREF00028".equals(DBerrorCode)){
    throw new DataUpdateException(ErrorRUREF00028);
} else if("RUREF00029".equals(DBerrorCode)){
    throw new DataUpdateException(ErrorRUREF00029);
} else if("RUREF00030".equals(DBerrorCode)){
    throw new DataUpdateException(ErrorRUREF00030);
} else {
  //default error
    throw new DataUpdateException(DATA_INSERT_ERROR);
}

我的要求是减少多个运算符,如果条件,在 if 语句和使用较少内存的轻量级代码中不超过 3 个运算符。

请建议是否有人有任何创造性的解决方案。

4

4 回答 4

2

我将使用地图。

map.put("RUREF00001",ErrorRUREF00001);
map.put("RUREF00002",ErrorRUREF00002);
map.put("RUREF00003",ErrorRUREF00004);

然后你只需写一行

throw new DataUpdateException(map.get(DBerrorCode));

旁注:Java 变量名以小写字母开头。

于 2017-04-06T07:26:35.667 回答
2
for (int i=1; i<=6; i++){
    String s = "RUREF0000" + i;
    //Define your error
    if(s.equals(DBerrorCode)){
            throw new DataUpdateException(your error);
    }

i = [27,30] 相同

最后,您可以为情况(i<1,i>6 和 i<27,i>30)设置一个 if 条件作为默认错误

您也可以定义开关案例https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

但这不会减少您的代码长度。这取决于你的任务是什么

于 2017-04-06T07:30:58.153 回答
0

对于省略if-else语句,您可以使用Enum

您的逻辑应如下所示:

  • 获取字符串代码值
  • 遍历枚举值Enum.values()
  • 如果字符串值与某些错误代码匹配 ->throw new Exception()使用此代码,例如参数
  • 如果没有匹配,则在最后抛出默认错误。

这是一个小演示:

enum ErrorCodes {
    RUREF_00001("RUREF00001"),
    RUREF_00002("RUREF00002"),
    RUREF_00003("RUREF00003");
    // ...
    private String errorName;

    ErrorCodes(String errorName) {
        this.errorName = errorName;
    }

    public String getErrorName() {
        return errorName;
    }
}

public class ErrorHandler {
    public static void main(String[] args) {
        String dbErrorCode = "ruref00003"; // get the error code from Database

        for (ErrorCodes code : ErrorCodes.values()) {
            if (code.getErrorName().equalsIgnoreCase(dbErrorCode)) {
                throw new DataUpdateException(dbErrorCode);
            }
        }
        //default error
        throw new DataUpdateException(DATA_INSERT_ERROR);
    }
}

因此,您的所有if-else语句都将替换为几行:

   for (ErrorCodes code : ErrorCodes.values()) {
      if (code.getErrorName().equalsIgnoreCase(dbErrorCode)) {
         throw new DataUpdateException(code);
      }
   }

这是更优雅的解决方案。

于 2017-04-06T07:42:07.390 回答
0

事实上,您可以使用Map类似的其他答案建议。

假设ErrorRUREF00001您传递给的参数(例如)DataUpdateExceptionString

Map<String, String> errorMap = new HashMap<>();

errorMap.put("RUREF00001", ErrorRUREF00001);
// populate other values ....

然后你可能有一个方法来检查映射的消息,如果找到一个,则使用它,如果没有找到,则使用另一个值:

public void manageError(final String dbErrorCode) {

    if (errorMap.containsKey(dbErrorCode)) {

        throw new DataUpdateException(errorMap.get(dbErrorCode));
    } else {

        throw new DataUpdateException(DATA_INSERT_ERROR);
    }
}

最后,而不是你的if else陈述,只需调用

   manageError(DatabaseReturnErrorCode);
于 2017-04-06T07:35:31.197 回答