今天在写代码的时候,发现了一个问题:
try{ Subject subject = ShiroUtil.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(map.get("account"),map.get("password")); subject.login(token); }catch (UnknownAccountException e) { return RUtil.error(REnum.USERNAME_OR_PASSWORD_ERROR.getCode(),REnum.USERNAME_OR_PASSWORD_ERROR.getMessage()); }catch (IncorrectCredentialsException e) { return RUtil.error(REnum.USERNAME_OR_PASSWORD_ERROR.getCode(),REnum.USERNAME_OR_PASSWORD_ERROR.getMessage());
可以看到这个两个catch下的代码重复了,这违背了“不写相同两行代码”的原则,后来在好奇心的趋使下,百度了一下,原来在jdk1.7的时候,可以用“|”来连接两个异常类,像这样:
try { Subject subject = ShiroUtil.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(userMap.get("account"),userMap.get("password")); subject.login(token); }catch(UnknownAccountException | IncorrectCredentialsException e){ return ResultVoUtil.erro(REnum.USERNAME_OR_PASSWORD_ERROR.getCode(),REnum.USERNAME_OR_PASSWORD_ERROR.getMessage()); }
如果用一个catch块处理多个异常,可以用管道符(|)将它们分开,在这种情况下异常参数变量(ex)是定义为final的,所以不能被修改。这一特性将生成更少的字节码并减少代码冗余。
另一个升级是编译器对重新抛出异常(rethrown exceptions)的处理。这一特性允许在一个方法声明的throws从句中指定更多特定的异常类型。