2016-11-23 69 views
1

当我想抛出一个NullPointerException时,我会选择什么?try/catch vs if/else throw 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,但我也在Kevin和Pau的一边。 –

回答

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方法时有什么作用,它具有返回值?(一些特定的对象)在那种情况下我会返回什么来确保出现错误? – SchAlubs

+1

当你抛出一个异常时,你不会返回任何东西。 –

+0

对,我知道,但你说我不应该在登录时抛出异常... – SchAlubs

-1

如果您尝试验证参数不为空,我会推荐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

第一码看起来合适,因为你已经测试了这个值,并且在if条件失败时可以给出null的结果。