java规约四:异常和返回
1、进行业务编码之前设计好自定义异常,错误码,出现异常时对用户和调用者一定要友好
2、约定好方法的返回值,空对象,空集合还是null,视情况而定
3、防止空指针NPE。
几种可能出现空指针的情况:
(1)数据库查询结构可能为空,选好了持久层框架后统一一下未查询到数据时的返回结果
(2)集合中取出的元素为null
(3)调用接口返回对象时,一律要进行空指针判断
(4)连续调用Obj.getA().getB().getC()
4、返回类型的定义和格式要统一设计好,现在一般是调用接口返回json格式,前端解析
5、关键位置的操作一定要加日志。日志使用占位符,不要用String拼接
给出一种返回类型Result的参考:
@Data public class Result { private String code; private String msg; private Object data = null; public Result() { } /** * 这个方法返回本身,因此可以实现链式调用 * * @param msg 封装的消息 * @return 完成封装后的结果对象 */ public Result msg(String msg) { this.msg = msg; return this; } /** * 这个方法返回本身,因此可以实现链式调用 * * @param results 封装的内容 * @return 完成封装后的结果对象 */ public Result data(Object results) { this.data = results; return this; } /** * 获取一个包含成功状态码的结果对象。 * 此结果对象中还未封装任何其他信息,需要调用 {@link Result#msg(String)} 方法, * 或者 {@link Result#data(Object)} 方法进行进一步的封装。 * * @return 一个包含正确状态码的结果对象。 */ public static Result success() { Result result = new Result(); result.setCode(ErrorCode.SUCCESS.getCode()); return result; } /** * 获取一个包含未知异常的结果对象。 * 此结果对象中还未封装任何其他信息,需要调用 {@link Result#msg(String)} 方法, * 或者 {@link Result#data(Object)} 方法进行进一步的封装。 * * @return 一个包含未知异常的结果对象。 */ public static Result error() { return error(ErrorCode.ERR_UNKNOWN_EXCEPTION); } /** * 根据传入的 {@code CommonException} 对象,创建一个特定错误的结果对象。 * * @param exception 一个错误对象 * @return 一个包含特定错误状态码和提示的结果对象。 */ public static Result error(CommonException exception) { Result result = new Result(); result.setCode(exception.getCode()); result.setMsg(exception.getMsg()); return result; } /** * 根据传入的 {@code ErrorCodeEnum} 对象,创建一个特定错误的结果对象。 * * @param errorCodeEnum 一个错误码枚举类型的对象 * @return 一个包含特定错误状态码和中文提示的结果对象。 */ public static Result error(ErrorCode errorCodeEnum) { return errorWithPrefix(errorCodeEnum, false); } /** * 根据传入的 {@code ErrorCodeEnum} 对象,创建一个特定错误的结果对象。 * * @param errorCodeEnum 一个错误码枚举类型的对象 * @param withPrefix 错误码是否要添加固定的前缀 * @return 一个包含特定错误状态码和中文提示的结果对象。 */ private static Result errorWithPrefix(ErrorCode errorCodeEnum, boolean withPrefix) { Result result = new Result(); result.setCode((withPrefix ? Constants.ERROR_CODE_PREFIX : "") + errorCodeEnum.getCode()); result.setMsg(errorCodeEnum.getMsgCN()); return result; } /** * 根据传入的 {@code ErrorCodeEnum} 对象,创建一个特定错误的结果对象。 * * @param errorCodeEnum 一个错误码枚举类型的对象 * @return 一个包含特定错误状态码和英文提示的结果对象。 */ public static Result errorEN(ErrorCode errorCodeEnum) { Result result = new Result(); result.setCode(Constants.ERROR_CODE_PREFIX + errorCodeEnum.getCode()); result.setMsg(errorCodeEnum.getMsgEN()); return result; } }
给出一种异常类设计的参考:
/** * 自定义的一个运行时异常。 */ public class CommonException extends RuntimeException { private final String code; private final String msg; public CommonException(String msg) { super(msg); this.code = ErrorCode.ERR_BUSINESS_EXCEPTION.getCode(); this.msg = msg; } public CommonException(ErrorCode errorCodeEnum) { super(errorCodeEnum.getMsgCN()); this.code = errorCodeEnum.getCode(); this.msg = errorCodeEnum.getMsgCN(); } public String getCode() { return code; } public String getMsg() { return msg; } }