2017-02-07 20 views
0

У меня есть немного сложной системы проверки, что упрощенным выглядит примерно следующим образом:Как избежать нулевого предупреждения при использовании @NotNull и проверять значение null в другом методе перед вызовом метода?

private static void mainMethod(@Nullable String startParam, @Nullable String nextParam) { 

    String nextStep = methodSelect(startParam, nextParam); 

    switch (nextStep) { 
     case "none": 
      break; 
     case "goFinal": 
      finalMethod(startParam); 
      break; 
     case "goNext": 
      nextMethod(nextParam); 
      break; 
    } 
} 

private static void nextMethod(@NotNull String nextParam) { 
    System.out.println(nextParam); 
} 

private static void finalMethod(@NotNull String startParam) { 
    System.out.println(startParam); 
} 

@NotNull 
private static String methodSelect(@Nullable String startParam,@Nullable String nextParam) { 
    if (startParam == null && nextParam == null) { 
     return "none"; 
    } if (startParam == null) { 
     return "goNext"; 
    } else { 
     return "goFinal"; 
    } 
} 

Но я получаю предупреждения, когда в операторе переключателя вызывающему как finalMethod() и nextMethod() о «Аргумент х могуществе be null ", хотя methodSelect() и оператор switch впоследствии удостоверяются, что эти аргументы не будут равны нулю. Как я могу избавиться от этих предупреждений, надеюсь, без дополнительной проверки на нуль или до этих методов? Спасибо!

Я использую IntelliJ IDEA 2016.3.4, Java 8, и аннотации:

import org.jetbrains.annotations.NotNull; 
import org.jetbrains.annotations.Nullable; 

ответ

0

Это очень хитрый код - вы имитируя отражение, чтобы сделать вызов различных методов в зависимости от времени выполнения тесты.

В IntelliJ IDEA вы должны будете подавить предупреждение в IDE или через code annotation.

Некоторые другие инструменты имеют более сложный анализ кода. Вот небольшой вариант вашего кода, который использует логическое значение вместо строки, чтобы указать, какой метод вызывать. Nullness Checker Checker Framework способен проверять надежность этого кода, благодаря аннотации postcondition @EnsuresNonNullIf.

import org.checkerframework.checker.nullness.qual.*; 

class Example { 

    private static void mainMethod(@Nullable String startParam, @Nullable String nextParam) { 

    if (! useFinal(startParam)) { 
     // do nothing 
    } else { 
     finalMethod(startParam); 
    } 
    } 

    private static void nextMethod(@NonNull String nextParam) { 
    System.out.println(nextParam); 
    } 

    private static void finalMethod(@NonNull String startParam) { 
    System.out.println(startParam); 
    } 

    @EnsuresNonNullIf(expression="#1", result=true) 
    private static boolean useFinal(@Nullable String startParam) { 
    if (startParam == null) { 
     return false; 
    } else { 
     return true; 
    } 
    } 

} 

@EnsuresNonNullIf аннотаций в настоящее время не обрабатывать строки, используемый в исходном коде; вы можете запросить такое расширение у сопровождающих или выполнить его самостоятельно и отправить запрос на перенос.

+0

Спасибо за отличный ответ! –

 Смежные вопросы

  • Нет связанных вопросов^_^