我有一个对象的类,如果用户试图向它的构造函数提供一个负数,我想输出一个警告,告诉他们他们以
的形式提供了一个无效的数字。System.out.println("ERROR ON LINE " + Thread.currentThread().getStackTrace()[2].getLineNumber() + ": You have provided an invalid number.\nSetting to default.");
编辑:我在系统中将值设置为默认值,我不希望程序终止。
我真正想知道的是我如何自动找到[2]。
答案 0 :(得分: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 Tutorial on Exceptions。
答案 1 :(得分: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
}
答案 2 :(得分:3)
您熟悉java exceptions吗?您可以在构造函数中抛出异常。
if(number<0){
throw new IllegalArgumentException("Argument "+number+" is illegal. must be positive");
}
这将强制用户提供合法参数,确保您的程序不会中断或挂起状态不佳。该异常还将提供一个整齐的堆栈跟踪,它显示了提供错误参数的错误到底是什么行。