如何解决@Sneaky Throws在龙目岛中的应用
我正在Java中使用lombok库,发现了一个注释:@SneakyThrows。 如文档所述:
@SneakyThrows伪造了编译器。换句话说,龙目岛不 包装或替换引发的检查异常,但使编译器 认为这是一个未经检查的异常。
因此,这是在compileTime处获取异常的旁路方法,但这不应是处理异常的正确方法,因为被旁路的异常可能会在运行时显示出怪异的行为。
因此,在哪种情况下使用@SneakyThrows意味着在哪种情况下,我们确实需要绕过任何检查的异常。
谢谢。
解决方法
添加到现有答案中。我个人不喜欢检查异常。参见以获取更多信息:https://phauer.com/2015/checked-exceptions-are-evil/
为了增加侮辱性,避免检查异常时代码会gets肿。考虑使用@SneakyThrows:
List<Instant> instantsSneaky = List.of("2020-09-28T12:30:08.797481Z")
.stream()
.map(Example::parseSneaky)
.collect(Collectors.toList());
@SneakyThrows
private static Instant parseSneaky(String queryValue) {
return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").parse(queryValue).toInstant();
}
与非@SneakyThrows相比
private static Instant parseNonSneaky(String queryValue) throws ParseException {
return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").parse(queryValue).toInstant();
}
List<Instant> instantsNonSneaky = List.of("2020-09-28T12:30:08.797481Z")
.stream()
.map(timeStamp -> {
try {
return parseNonSneaky(timeStamp);
} catch (ParseException e) {
throw new RuntimeException(e);
}
})
.collect(Collectors.toList());
因此@SneakyThrows的应用使代码更简洁。
,在JAVA 8及更高版本中,使用lambda时尤其不容易。
- 主要针对Java 8的较早版本进行考虑。
- 其目的是故意抛出异常,例如,以进行警告。这样,其他服务/程序/代码可以标识应如何处理请求/响应流。如果您已经有了适当的机制,则无需担心。
@SneakyThrows
在当前的传统应用程序开发中用处不大,可以用在某种状态机程序中,在这种情况下,有必要(尽管我没有专门知识)来确定程序的状态电流。这只是不同情况下的一个示例,可能还会更多。
我相信这里的目的是使编译器不需要将任何异常添加到方法声明中。
例如,如果方法是
public void throwsCheckedException() {
throw new IOException("IO exception thrown");
}
这将导致需要一个编译时异常
public void throwsCheckedException() throws IOException {
throw new IOException("IO exception thrown");
}
@SneakThrows注释可缓解此问题-原始方法声明为
@SneakyThrows
public void throwsCheckedException() {
throw new IOException("IO exception thrown");
}
这不会导致编译时错误。 注意,IDE可能仍会将此错误突出显示为错误,例如,在IntelliJ中,您将需要使用Lombok插件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。