2013-09-23 52 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"); 
} 

這將迫使用戶提供確保你的程序不破裂或在一個糟糕的狀態掛了法律論證。這個異常還會提供一個整潔的堆棧跟蹤,它顯示提供錯誤參數的錯誤的確切位置。