Пользовательское сообщение об ошибке для EmptyStackException в Java?

Я реализую стек в Java. Для операции pop я хочу бросить EmptyStackException. Согласно документации , EmptyStackException имеет один конструктор, EmptyStackException(). Это -

Создает новый объект EmptyStackException с нулевым значением в качестве строки сообщения об ошибке.

Поэтому он не может принимать мое пользовательское сообщение об ошибке в качестве параметра. Мне нужно установить пользовательское сообщение об ошибке, потому что оно имеет значение null в качестве сообщения об ошибке, а getMessage() возвращает значение null. Если я использую это исключение, мне придется жестко запрограммировать свое сообщение об ошибке, где я поймаю EmptyStackException.

public int pop() {
    if (empty())
        throw new EmptyStackException(); // cannot take error message as argument
    int data = top.getData();
    top = top.getNext();
    return data;
}
public static void main(String[] args) {
    Stack stack = new Stack();
    try {
        System.out.println(stack.pop());
    } catch (EmptyStackException e) {
        System.out.println("Stack is empty");  // my hardcoded message
}

Другой способ — использовать Exception вместо EmptyStackException. У него есть конструктор: Exception(String message). Используя это, я могу установить свое собственное сообщение.

public int pop() throws Exception {
    if (empty())
        throw new Exception("Stack is empty"); // take message as argument
    int data = top.getData();
    top = top.getNext();
    return data;
}
public static void main(String[] args) {
    Stack stack = new Stack();
    try {
        System.out.println(stack.pop());
    } catch (Exception e) {
        System.out.println(e.getMessage()); //print message set from the throwing position
}

Мой вопрос в том, какой способ является наилучшей практикой или есть какой-либо другой способ?


person Jobayer Ahmmed    schedule 20.09.2017    source источник
comment
Вы также можете расширить EmptyStackException и написать конструктор, который получает сообщение, и getMessage, который возвращает вашу строку.   -  person Shirkam    schedule 20.09.2017
comment
Зачем нужно индивидуальное сообщение? EmptyStackException может означать только одно...   -  person Socratic Phoenix    schedule 20.09.2017
comment
Его родительский класс — RuntimeException, у которого есть cstr, поддерживающий String. Вы пробовали использовать пользовательское сообщение? Я никогда не пробовал, потому что имхо это уже самоочевидно. Я думаю, что регистрации пользовательского сообщения будет достаточно.   -  person Tim    schedule 20.09.2017
comment
@SocraticPhoenix Поскольку EmptyStackException означает одно, можно ли распечатать собственное сообщение? Я пытаюсь узнать, что является лучшей практикой.   -  person Jobayer Ahmmed    schedule 20.09.2017


Ответы (2)


EmptyStackException класс самоочевидный. Не думайте, что требуется дополнительное сообщение. Я бы оставил как есть :). Если вам все еще нужно сообщение, то для этого широко используется создание собственного класса исключений.

person udalmik    schedule 20.09.2017
comment
Я хочу напечатать сообщение об ошибке после обнаружения исключения. Но EmptyStackException не имеет сообщения об ошибке, и я не могу напечатать ничего, кроме нуля. Поэтому я жестко кодирую сообщение в блоке catch. Это лучшая практика? - person Jobayer Ahmmed; 20.09.2017
comment
Это абсолютно нормально, если вы явно поймаете EmptyStackException, например. try {/**/} catch (EmptyStackException e) {this.log.error("Stack is empty");} - person udalmik; 20.09.2017

Создайте собственное пользовательское исключение следующим образом:

public class EmptyParameterException extends Exception {

    public EmptyParameterException (String message) {
        super(message);
    }

}
person StefanE    schedule 20.09.2017