2013-09-23 53 views
2

我有一个对象的类,如果用户试图为其构造函数提供一个负数,我想输出一个警告,告诉他们他们提供了一个无效号码,形式为获取当前行号码Java

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

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

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

+0

为什么你想告诉最终用户一个源代码行号? – bmargulies

+0

@bmargulies它也在调试。我通常使用行号作为错误号码。这对我来说是实践的东西,所以我亲自跟踪问题。 –

+0

要进行调试,请使用(例如)log4j,并让它为您记录行号。 – bmargulies

回答

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

程序只会在未处理异常时终止。GUI和服务器框架安全隔离构造函数异常并继续运行是很常见的。 – chrylis

+0

我知道,我知道。我会把它放进去。 – tbodt

+0

你能抛出异常并抓住行号吗? –

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 
} 
3

您是否熟悉java exceptions?你可以在构造函数中抛出异常。

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

这将迫使用户提供确保你的程序不破裂或在一个糟糕的状态挂了法律论证。这个异常还会提供一个整洁的堆栈跟踪,它显示提供错误参数的错误的确切位置。