java构造函数可以抛出异常吗_关于java:使构造函数抛出异常是一种好习惯吗?...

本问题已经有最佳答案,请猛点这里访问。

让构造函数抛出异常是一个好的实践吗?例如,我有一个类Person,我将age作为它的唯一属性。现在我提供的课程是

class Person{

int age;

Person(int age) throws Exception{

if (age<0)

throw new Exception("invalid age");

this.age = age;

}

public void setAge(int age) throws Exception{

if (age<0)

throw new Exception("invalid age");

this.age = age;

}

}

我觉得不错,但你的代码复制是不好的做法。只需从构造函数调用setage来减少大量重复的代码

在这种情况下抛出IllegalArgumentException可能是个好主意,这使得它非常明确。

@codemwnci:如果setAge是虚拟的(这里的情况也是这样),这不是一个好主意。

@你能解释一下吗?为什么虚拟方法不应该在构造函数内部调用?

@未知:这里有解释。

在构造函数中抛出异常并不是一个糟糕的实践。事实上,对于一个构造函数来说,这是表示存在问题的唯一合理的方法;例如,参数无效。

然而,明确声明或抛出java.lang.Exception几乎总是不好的做法。

您应该选择一个与发生的异常条件相匹配的异常类。如果抛出Exception,则调用方很难将此异常与任何其他可能已声明和未声明的异常分开。这使得错误恢复变得困难,如果调用者选择传播异常,问题就会扩散。

有人建议用assert来核对论点。问题在于,可以通过jvm命令行设置打开和关闭对assert断言的检查。使用断言来检查内部不变量是可以的,但是使用它们来实现JavaDoc中指定的参数检查不是一个好主意…因为这意味着您的方法将只在启用断言检查时严格实现规范。

assert的第二个问题是,如果一个断言失败,那么AssertionError就会被抛出,得到的智慧是试图抓住Error及其任何子类型是一个坏主意。

我有一个例子,在这个例子中,从代码的异常中恢复是不可能的。您需要手动修复才能恢复。例如,对象构造函数从配置文件加载测试数据(用户名、密码等)。然后,所有测试都使用config对象中的数据。如果找不到文件、数据格式错误等,则会引发异常。我认为我们从异常中恢复的唯一方法是人为修复与文件相关的问题。那么,在这种情况下抛出异常可以吗?

IMO,不。抛出一个特定的异常是很好的做法,而不是java.lang.Exception。如果没有别的,它将帮助人类读取stacktrace,诊断问题并修复它。如果无法识别要引发的适当现有异常,则声明自定义异常大约需要10行代码。

我一直认为在构造函数中抛出检查过的异常是一种糟糕的实践,或者至少是应该避免的事情。

原因是您不能这样做:

private SomeObject foo = new SomeObject();

相反,您必须这样做:

private SomeObject foo;

public MyObject() {

try {

foo = new SomeObject()

} Catch(PointlessCheckedException e) {

throw new RuntimeException("ahhg",e);

}

}

当我构建某个对象时,我知道它的参数是什么。那么,为什么要期望我把它包装在一个试捕获中呢?你说,但是如果我用动态参数构造一个对象,我不知道它们是否有效。好吧,你可以…在将参数传递给构造函数之前先验证这些参数。那是个很好的练习。如果您只关心参数是否有效࿰

你可能感兴趣的:(java构造函数可以抛出异常吗)