【发布时间】:2014-07-12 02:17:50
【问题描述】:
在为学校项目开发课程(如学校课程)数据库系统时,我偶然发现了一个争论的问题。
我有一个名为 Course 的课程。这是该类的构造函数(另一个是分配默认值的空白构造函数):
public Course(String name, String code, char level, int academicYear)
{
serialNumber = nextSerialNumber++;
if (name == null)
{
throw new NullPointerException("Name can not be null.");
}
else
{
this.name = name;
}
if (code == null)
{
throw new NullPointerException("Code can not be null.");
}
else
{
this.code = code;
}
if (indexOf(level, VALID_LEVEL) == -1)
{
throw new InvalidLevelException("Level must be one of "
+ "characters defined in the public array in Course.");
}
else
{
this.level = level;
}
if (String.valueOf(academicYear).length() != NUMBER_OF_DIGITS_IN_YEAR)
{
throw new InvalidYearException("Year must be a four digit number!");
}
else
{
this.academicYear = academicYear;
}
}
在哪里
InvalidLevelException
和
InvalidYearException
是作为子类的自定义异常
RuntimeException
我从该构造函数中抛出异常以指示是否有任何问题。例如,如果在读取数据文件时遇到错误数据,我可以拒绝它并将其写入日志(根据项目要求),只需将该构造函数放在 try-catch 块中,然后捕获这些异常,然后在那个 catch 块中记录错误数据。
在把这段代码给我的老师看之后,他说从构造函数中抛出异常是不合适的。但是,我阅读了许多鼓励这种做法的 Stackoverflow 帖子。
我的问题是:可以从上面的构造函数中抛出异常吗?
非常感谢附上答案的可靠来源(例如,官方文件或权威书籍)。
非常感谢。
【问题讨论】:
-
我认为这主要是基于意见。不过,我不会直接抛出 NullPointerException 。我会抛出一个 IllegalArgumentException。不过,明确列出可以抛出的异常类型可能是有意义的。也 javadoc 它关于异常以及它们何时发生。一般来说,我尽量避免它,但我认为这是一个数据验证,所以应该没问题。
-
看一下JDK
HashMap类实现的代码。检查此构造函数:public HashMap(int initialCapacity, float loadFactor),其中包含:if (initialCapacity < 0) { throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); } -
你应该问问你的导师为什么会这样想。也许他可能有一些许多作者没有的洞察力。无论如何,如果您没有在构造函数中捕获错误,那么您将不得不在其他地方捕获它们,或者当您的对象实际需要对其进行操作时(这可能会浪费大量时间和资源早已经被避免了),或者你将不得不希望每个人都知道检查这些问题。这也不能保证。
-
对于这种情况,您可以使用
CourseBuilder类,该类将获取必要的数据来创建Course并在build()方法中抛出异常,因此可以将异常从Course构造函数并位于build()方法中。但这会导致简单而优雅的设计过于复杂。你应该告诉你的教授访问这个网站,可能会发布一个问题:)。
标签: java exception constructor