2

我有一个对象类,如果用户尝试向它的构造函数提供负数,我想输出一个警告,告诉他们他们提供了一个无效数字,形式为

System.out.println("ERROR ON LINE " + Thread.currentThread().getStackTrace()[2].getLineNumber() + ": You have provided an invalid number.\nSetting to default.");

编辑:我将值设置为系统中的默认值,我不希望程序终止。

我真正想知道的是我如何自动找到[2]。

4

3 回答 3

4

在这种情况下,您应该抛出异常,而不是打印错误消息。这具有在报告中包含行号的好处。您将使用这行代码:

throw new IllegalArgumentException("You must provide a positive number");

如果发生这种情况,您将收到如下错误报告:

Exception in thread main: java.lang.IllegalArgumentException: You must provide a positive number
    at YourClass(YourFile.java:lineNumber)

如果这不是 GUI 应用程序,程序也将终止。GUI 应用程序和其他类型的应用程序将通过错误报告对此不以为然,然后继续。

有关异常的更多信息,请参阅Java 异常教程

于 2013-09-23T00:35:08.617 回答
3

不要print为此使用声明;这正是投掷IllegalArgumentException. 异常处理在语义上更加清晰,如果您将无效数字传递给构造函数,则无论如何都不希望构造成功,并且如果您手动将消息写入到System.out,则在运行图形或服务器时它们会丢失-基于应用程序。异常将具有发生错误的行号,并帮助程序员首先弄清楚无效数字是如何最终传递给构造函数的。

你可以这样说:

if(number < 0)
    throw new IllegalArgumentException("number must not be negative");

更好的是,如果你正在编写一个可以使用Bean Validation的应用程序,你可以将你的约束写入你的代码中,这样对用户来说是显而易见的并且可以在编译时检查:

public MyClass(@Min(0) int number) {
    // constructor
}
于 2013-09-23T00:34:48.270 回答
3

你熟悉java异常吗?您可以抛出异常,例如在构造函数中。

if(number<0){
   throw new IllegalArgumentException("Argument "+number+" is illegal. must be positive");
}

这将迫使用户提供合法的论据,以确保您的程序不会中断或挂在不良状态。该异常还将提供一个简洁的堆栈跟踪,准确显示提供错误参数的错误发生在哪一行。

于 2013-09-23T00:35:57.597 回答