2016-11-23 11 views
1

Что бы я выбрал, когда вы хотите выбросить исключение NullPointerException?try/catch vs if/else throwing NullPointerException

1)

if(parameter != null){ 
    // do something 
} else { 
    Log.error("Reason for Exception."); 
    throw new NullPointerException(); 
} 

2)

try{ 
    // do something 
} catch (NullPointerException npe) { 
    Log.error("Reson for Exception."); 
    throw npe; 
} 
+1

Нет, я бы выбрал «IllegalArgumentException», но я предпочитаю первый – Pau

+1

честно ... я бы никогда не захотел вручную запускать «NPE», если это метод, я скорее брошу ' IllegalArgumentException' там. – SomeJavaGuy

+0

[Эффективное Java] (https://books.google.hr/books?id=ka2VUBqHiWkC&pg=PA248&lpg=PA248&dq=effective+java+standard+exceptions&source=bl&ots=yZJoQmw0M0&sig=8BlDhQjQqy3g41tQCCS2Znuk_T8&hl=en&sa=X&ved=0ahUKEwi1-sqiub7QAhXKIsAKHWNXBaAQ6AEIPzAG#v= onepage & q & f = false) советует NPE, но я также на стороне Кевина и Пау. –

ответ

3

В 2) вы не будете точно знать, какое выражение бросил NPE. В 1) совершенно понятно, почему вы выбрасываете исключение. Если необходимо, выполните ряд отдельных нулевых проверок.

Однако ваш первый подход должен быть переписан:

if (arg == null) { 
    throw new IllegalArgumentException("arg is null"); 
} 
... just go on with the method, no else block needed 

И если вы по крайней мере на Java 7:

Objects.requireNonNull(arg, "arg is null"); 

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

+0

но что мне делать при добавлении метода if/else in, который имеет возвращаемое значение?(какой-то конкретный объект), что я должен вернуть в этом случае, чтобы убедиться, что произошла ошибка? – SchAlubs

+1

Когда вы бросаете исключение, вы ничего не возвращаете. –

+0

Правильно, я знаю, но ты сказал, что я не должен бросать исключение при регистрации ... – SchAlubs

-1

Если вы пытаетесь проверить параметр не null, я бы порекомендовал Guava's Preconditions, в частности checkNotNull.

Preconditions.checkNotNull(parameter, "Please specify a value for parameter"); 

Если параметр пуст, он выдает NPE с указанным сообщением.

1

Во-первых, я бы использовал IllegalArgumentException более NullPointerException в этом случае. Но в случае выбора между ними, я предпочитаю первый, потому что это ясно.

В противном случае, чтобы избежать такого шаблона, который, на мой взгляд, делает его уродливым. Я бы использовал класс Assert, который проверяет его. Вы можете сделать свой собственный класс Assert или использовать некоторые из них, которые выполняются, например Spring Assert и так далее.

Ваш Assert класс будет что-то вроде этого:

public Assert { 

    public static void isNotNull(Object object) { 
      if(null == object) 
       throw new IllegalArgumentException(".. must be not null"); 
    } 

    .... 

} 

Тогда вам просто нужно использовать его как то (это уменьшает код boilperplate на одну строку):

Assert.isNotNull(parameter); 
+0

Это в JDK: https://docs.oracle.com/javase/7/docs/api/java/util/Objects.html#requireNonNull(T,%20java.lang.String) –

+0

Зачем вам использовать меньше конкретное исключение за более конкретное исключение? – EJP

1

Первый код выглядит так, потому что вы уже проверили значение и можете дать результат null при нарушении условия if.

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

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