2013-09-23 3 views
2

У меня есть класс для объекта, и если пользователь пытается предоставить отрицательное число его конструктору, я хочу вывести предупреждение, в котором сообщается, что они предоставили недопустимое число в формеПолучить текущий номер строки Java

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

EDIT: Я установил значения в значения по умолчанию в системе, я не хочу, чтобы программа завершалась.

Что я действительно хочу знать, так это то, как я автоматически выбираю [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

Программа будет завершена только в том случае, если исключение не обрабатывается.Для графических интерфейсов и серверных фреймворков довольно часто безопасно перекрывать исключение конструктора и продолжать работу. – 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"); 
} 

Это заставит пользователя предоставить юридический аргумент, гарантирующий, что ваша программа не сломается или не окажется в плохом состоянии. Исключение будет также содержать аккуратный стек, который показывает, в какой именно строке была сделана ошибка предоставления плохих аргументов.

Смежные вопросы