【问题标题】:Right way to use the @NonNull annotation in Android Studio在 Android Studio 中使用 @NonNull 注解的正确方法
【发布时间】:2015-12-15 15:00:58
【问题描述】:

我想在 Android 中使用 @NonNull 注释,但我想不出正确的方法。 我建议你这个例子:

public void doStuff(@NonNull String s){
     //do work with s...    
}

所以当我打电话给doStuff(null) 时,IDE 会给我一个警告。问题是我不能依赖这个注释,因为就像this 问题指出的那样,它们不会传播很远。所以我想对我的方法进行空检查,如下所示:

 if(s==null) throw new IllegalAgrumentException();

但是 IDE,假设 s!=null,会警告我 s==null 总是假的。我想知道最好的方法是什么。

我个人认为应该有一个像@ShouldntBeNull 这样的注释检查并警告null没有传递给它,但是抱怨什么时候该值已检查为空。

【问题讨论】:

  • “我想知道最好的方法是什么”——IDE 中应该有一个快速修复来抑制该警告。 “我个人认为……”——如果你愿意,你可以file a feature request
  • @CommonsWare 在 Android Studio 1.3.2 中似乎没有快速的SuppressWarning 修复
  • 嗯,那很臭。 :-(
  • 无论如何我都按照您的建议做了并提交了功能请求。你可以找到它here

标签: java android annotations non-nullable


【解决方案1】:

Google examples如下操作

import static com.google.common.base.Preconditions.checkNotNull;

...

public void doStuff(@NonNull String sParm){
     this.sParm= checkNotNull(s, "sParm cannot be null!");
}

【讨论】:

    【解决方案2】:

    您可以为此使用Objects.requireNonNull。它将在内部进行检查(因此 IDE 不会在您的函数上显示警告)并在参数为 null 时引发 NullPointerException

    public MyMethod(@NonNull Context pContext) {
        Objects.requireNonNull(pContext);
        ...
    }
    

    如果您想抛出另一个异常或使用 API 级别

    public class Check {
        public static <T> T requireNonNull(T obj) {
            if (obj == null)
                throw new IllegalArgumentException();
            return obj;
        }
    }
    

    并像这样使用它:

    public MyMethod(@NonNull Context pContext) {
        Check.requireNonNull(pContext);
        ...
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用注释样式抑制来禁用特定的空检查警告,例如:

          public MyMethod(@NonNull Context pContext) {
              //noinspection ConstantConditions
              if (pContext == null) {
                  throw new IllegalArgumentException();
              }
              ...
          }
      

      您每次都需要//noinspection ConstantConditions

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-08
        • 2020-10-28
        • 1970-01-01
        • 2018-11-01
        • 2023-03-24
        • 1970-01-01
        • 2021-09-13
        相关资源
        最近更新 更多