2015-09-18 6 views
18

Я хотел бы использовать аннотацию @NonNull на Android, но я не могу понять, как это сделать. Я предлагаю вам этот пример:Правильный способ использования аннотации @NonNull в Android Studio

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

Так что, когда я называю doStuff(null) интегрированная среда даст мне предупреждение. Проблема в том, что я не могу полагаться на эту аннотацию, поскольку, как и вопрос this, они не распространяются очень далеко. Так что я хотел бы поставить нулевую проверку на мой метод, как это:

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

Но IDE, предполагая, что s!=null, предупреждает меня, что s==null всегда ложно. Я хотел бы знать, как лучше всего это сделать.

Я лично считаю, что должно быть аннотация как @ShouldntBeNull что только проверки и предупреждает, что нуль не передается к нему, но не жалуется, когда значение нуля проверяется.

+1

«Я хотел бы знать, что это лучший способ сделать это» - там должно быть быстро исправить в среде IDE, чтобы пресечь это предупреждение. «Я лично думаю ...» - вы можете [указать запрос функции] (https://code.google.com/p/android/issues/list), если хотите. – CommonsWare

+0

@CommonsWare Не похоже на быстрое исправление 'SuppressWarning' в Android Studio 1.3.2 – MMauro

+0

Ну, это воняет. :-( – CommonsWare

ответ

5

Вы можете использовать подавление комментариев в стиле, чтобы отключить это конкретное предупреждение проверки нуля, например .:

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

Вам нужны что //noinspection ConstantConditions каждый раз, когда вы делаете это.

9

Для этого вы можете использовать Objects.requireNonNull. Он будет выполнять проверку внутри (так IDE не будет отображаться предупреждение о вашей функции) и поднять NullPointerException когда параметр null:

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

Если вы хотите, чтобы бросить еще одно исключение или использовать уровень API < 19, то вы можете просто сделать свой собственный вспомогательный класс для реализации той же проверки. например

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); 
    ... 
} 
+0

возможно также [ этот ответ] (http://stackoverflow.com/a/41679666/6287240) полезен – TmTron

5

Google examples сделать это следующим образом

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

... 

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