关于方法返回值@NotNull注解与代码合规性的疑问
关于方法返回值@NotNull注解与代码合规性的疑问
先把你提供的代码贴出来方便分析:
import org.jetbrains.annotations.NotNull; public class TestClass { @NotNull StringBuffer met1(Integer a) { if (a == 3) throw new RuntimeException(); return new StringBuffer("this"); } public static void main(String[] args) { TestClass m = new TestClass(); StringBuffer mmm = m.met1(3); } }
嘿,我来给你拆解下这个问题哈:
首先,你说“方法可以潜在返回null”其实是个小误解~咱们逐行看met1方法的逻辑:
- 当传入的
a等于3时,方法直接抛出了RuntimeException,程序执行到这一步就直接终止了,根本走不到后面的return语句,所以这种情况下根本不会有返回值; - 其他参数情况,方法会返回一个全新的
StringBuffer实例,绝对不会是null。
然后再说说@NotNull注解的公开契约:这个JetBrains的注解,核心是向调用者承诺只要方法正常执行完毕,返回的结果一定是非null的——它并不保证方法必须正常返回(也就是允许方法抛出异常来终止执行)。所以从这个角度看,met1方法其实没有违反@NotNull的契约,它的表现完全符合注解的承诺。
不过这段代码确实有两处不太规范的地方:
main方法里直接调用met1(3),运行时会直接抛出未捕获的异常导致程序崩溃,这显然不是合理的调用方式;met1方法的参数校验逻辑不够友好,直接抛出未受检的RuntimeException,调用者如果没注意到这个逻辑,很容易踩坑,最好能通过Javadoc明确标注参数限制,或者声明受检异常让调用者必须处理。
内容来源于stack exchange
相关产品推荐
相关产品推荐

