相关疑难解决方法(0)

如何更有效地使用@Nullable和@Nonnull注释?

我可以看到@Nullable@Nonnull注释可以在防止有用NullPointerException秒,但他们并不很远传播.

  • 在一个间接层之后,这些注释的有效性完全下降,所以如果你只添加一些注释,它们就不会传播得很远.
  • 由于这些注释没有得到很好的执行,因此存在假设标记的值@Nonnull不为空并因此不执行空检查的危险.

下面的代码会导致标有一个参数@Nonnullnull没有提出任何投诉.它会NullPointerException在运行时抛出.

public class Clazz {
    public static void main(String[] args){
        Clazz clazz = new Clazz();

        // this line raises a complaint with the IDE (IntelliJ 11)
        clazz.directPathToA(null);

        // this line does not
        clazz.indirectPathToA(null); 
    }

    public void indirectPathToA(Integer y){
        directPathToA(y);
    }

    public void directPathToA(@Nonnull Integer x){
        x.toString(); // do stuff to x        
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使这些注释更严格地执行和/或进一步传播?

java annotations nullable nullpointerexception code-standards

120
推荐指数
7
解决办法
14万
查看次数

Android @NonNull的用处

一些阅读和问题后,像这样的,我想知道是否有在使用点@NonNull支持Android注解.

如果我尝试使用注释为@NonNullnull参数调用方法,我可以看到来自Android Studio的非常小的警告.只是警告??

单元测试怎么样?我应该用空参数测试方法吗?如果我这样做......我会得到一个NullPointerException,我的测试将失败.

假设我们是两位开发人员.一个在API上工作,另一个在各种方式下测试API.作为第二个开发人员,我有责任测试所有内容,以便API可以防弹.这是单元测试的重点,对吗?

那么......第一个使用@NonNull的开发人员有什么意义呢?

如果其他人将此API与null参数一起使用......那么API将抛出NPE.然后他会想:"Urg,那个API糟透了...... NPE!" 他会是对的.那个顽皮的开发人员没有检查他发送的参数是否为null应该面临一个IllegalArgumentException,因为这是他的错误而不是API的错误!

我错了吗 ?

我认为这些注释会强制编译器显示错误attempting to call methodName(@NonNull Object object) with null parameter.

更新1

好的,谢谢大家的意见.如果可能的话,我想总结一下我在这里遇到的"问题".以抽象的方式.

我编写了一些代码(一个API,一个库,一个类,等等),私有内部代码由提供功能的公共方法包装.

假设这些公共方法将被其他任何人(包括我)使用.他们中的一些人接受的决定必须永远不会为,否则所有地狱都会破裂.

阅读您的评论,我面临以下选择:

  1. 继续使用@NonNullJava文档规定支持的合同/注释()parameter must not be null.不要检查空参数(否则IDE会警告我),不知何故,祈祷我永远不会收到空参数;
  2. 与上面相同,但强制执行空检查(即使IDE会发出警告condition will always be false)并且IllegalArgumentException在我收到空参数的情况下抛出而不是导致NPE;
  3. 停止使用合同/注释,使用Java Doc警告其他开发人员并添加所有参数的手动检查.

最后,对于单元测试......我知道我不能使用防弹代码,但我喜欢尽可能地"测试"我的代码,以防止我的代码出现意外行为以及验证过程(这是在单元测试的基础上,我相信) -

java android unit-testing annotations android-studio

18
推荐指数
1
解决办法
6134
查看次数