0

阅读有效的java,它提到我们需要验证方法参数作为一种好习惯,公共方法抛出异常,私有方法断言。但是,我们是否需要对实例变量采取任何措施。

EG:(不要将示例作为用例,主要问题是Do I need to validate instance var or Not ?。示例仅用于解释我的意思。)

class Tree {

   private Node root;

   public doSomething() {
      TreeNode node = root;
   }
}

现在假设root从未初始化并doSomething()直接调用,它会导致 NullPtrException。

Do we need to guard against it ? If yes then how ? If no then why not ?

4

3 回答 3

1

怎么样:

if (root == null) {
    throw new SomethingException();
}
TreeNode node = root;

简单地说,只需对根变量执行空检查,如果它为空,则相应地执行代码以解决该问题或为其抛出新异常。

于 2013-09-26T17:51:10.453 回答
0

将实例变量的任何验证代码移动到构造函数和设置器,以便在设置或更改它时检查它,如果在更改之前输入无效,则抛出任何异常。

对于完全构造的对象,这会使实例变量始终处于有效状态,因此您不必在其他任何地方进行额外的验证。

于 2013-09-26T17:58:10.970 回答
0

检查方法参数的既定做法可以推广到检查类的正确使用doSomething()在给定的示例中,当实例变量root尚未初始化时调用方法是非法的。

如果你想要一个最佳实践规则,一般不是检查实例变量,而是检查一个类的某个使用协议是否被遵守。(除非类是以不需要遵循特定协议的方式编写的,这通常是更好的选择。)这种检查当然通常涉及检查实例变量。

与在否定方法参数检查之后抛出一个相反IllegalArgumentException,协议违反应该导致一个IllegalStateException.

在给定的示例中,IllegalStateException应该抛出 an,因为该实例不处于doSomething()可以调用的状态。

于 2013-09-26T19:52:43.827 回答