如果私有函数需要相同的输入,则应在公共函数中明确执行异常检查

时间:2013-11-29 03:42:24

标签: java exception effective-java

有效的Java清楚地表明assert用于验证私有函数的参数。如果方法是公共方法,那么如果null是无效参数,则该方法应抛出NPE。

例如:

public void foo (Sting str) {
   char[] ch = str.toCharArray();
}

在上面的代码中,我们不需要显式检查以确保str为null,或者不需要null.toCharArray将抛出NPE

但如果代码改变为这样的话会怎么样:

   public void foo (String str) {
      List<String> strList = new ArrayList<String>();
      bar (str, strList);
   }

   private void bar(String str, strList) {
        assert strList != null;
        char[] ch = str.toCharArray();
        ... ... .. 
   }

在这样的代码中,它会出现在私人功能栏上以抛出NPE。根据有效的java,私有代码应该只通过断言进行验证。 以下代码是否会被认为是比上述代码更好的做法?

 public void foo (String str) {
          if (str == null)  throw NPE;
          List<String> strList = new ArrayList<String>();
          bar (str, strList);
       }

       private void bar(String str, strList) {
            assert str != null;
            assert strList != null;
            char[] ch = str.toCharArray();
            ... ... .. 
       }

1 个答案:

答案 0 :(得分:2)

在你的公共方法foo中,你有以下

if (str == null) throw new NullPointerException;

这通常被称为保护子句,并且通常比仅通过不包含任何内容而抛出空指针异常更具可读性。

关于assert,它通常在生产代码中没有使用@Sotirios提及。有关其他信息,请查看此答案:Java assertions underused

这里肯定存在一些更好的主观性,但从可读性的角度来看,公共方法中的保护条款似乎更具可读性。断言不提供额外的值,特别是如果仅从该公共方法调用该私有方法。断言永远不会触发。