上下文:我正在为学校写一个信号量类,其中一个要求是它可能没有用负值初始化。
现在我的构造函数抛出异常:
/**
* Constructor
*/
public Semaphore(int value) throws Exception
{
if (value < 0)
throw new Exception("Negative value provided for initial constructor.");
this.value = value;
}
为了实例化信号量而处理异常对我来说似乎过于沉重,所以我正在考虑将任何负值静默设置为零,即:
/**
* Constructor
*/
public Semaphore(int value)
{
if (value < 0)
this.value = 0;
else
this.value = value;
}
答案 0 :(得分:8)
您应该使用IllegalArgumentException
代替。它不需要显式的异常处理,它的行为与您想要的完全相同,即发出非法参数。
答案 1 :(得分:1)
我建议抛出IllegalArgumentException
:
抛出表示某个方法已被传递为非法或 不恰当的论点。
如果您的项目使用Guava,则可以使用Preconditions:
public Semaphore(int value) throws Exception
{
Preconditions.checkArgument(value < 0,
"Negative value provided for initial constructor.");
this.value = value;
}
如果条件评估为false
,则会抛出IllegalArgumentException
。
在我看来,这样代码可以更具可读性。
答案 2 :(得分:1)
如果您说:嘿,这些值直接来自用户。 纠正并留言。
如果您说:嘿,会生成值并且错误会产生负值。
throw new IllegalArgumentException("Negative Value",
new IndexOutOfBoundsException(value+""));
如果您说:嘿,我想让VM决定抛出或更正。使用assert value > 0;
。
答案 3 :(得分:-1)
一般来说,如果你有一个1000个类的项目,每个类有20个函数,那就是20000个函数。检查输入参数并为许多20000函数抛出异常将使代码充满验证检查。我更喜欢将javadoc添加到函数中,说明函数的输入参数不能为负(以及函数的用途)。这样,函数的用户(程序员)不必检查函数的内容以确定如何使用它以及什么是无效的。此外,他的IDE的intellisense将弹出javadoc消息,因为他正在使用该函数来提供该信息。如果他违反了javadoc,请考虑让函数或其调用的函数之一在调用堆栈中抛出异常而不显式执行,或者让函数不按预期工作而不抛出异常。如果您认为提供无效输入会产生一些不容易追踪的奇怪行为,您可以考虑明确地提出异常。 javadoc将帮助他追踪问题,而不必特别抛出异常。一旦调试了业务逻辑,除非业务逻辑中存在错误,否则不应经常发生异常。
我不认为异常应该是验证用户输入的一部分。您的用户输入应该在它到达业务逻辑之前通过验证,而不是在它到达业务逻辑功能时验证。关于验证上传的xml文档的相同论点。在将xml架构传递给业务逻辑之前,请将其检查。您的验证逻辑应该基于true / false(验证通过),而不是基于抛出无效输入的异常。