获取当前行号Java

时间:2013-09-23 00:31:59

标签: java

我有一个对象的类,如果用户试图向它的构造函数提供一个负数,我想输出一个警告,告诉他们他们以

的形式提供了一个无效的数字。
System.out.println("ERROR ON LINE " + Thread.currentThread().getStackTrace()[2].getLineNumber() + ": You have provided an invalid number.\nSetting to default.");

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

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

3 个答案:

答案 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");
}

这将强制用户提供合法参数,确保您的程序不会中断或挂起状态不佳。该异常还将提供一个整齐的堆栈跟踪,它显示了提供错误参数的错误到底是什么行。