Исключение, которое будет выдано, если статическая переменная не была инициализирована

У меня есть метод static concatString(String source) в class, который принимает String аргумент "источник". В том же классе есть еще одна переменная static string "цель". «Целевая» строка инициализируется в другом статическом методе с именем init(). Теперь, если пользователь вызывает метод concatString() перед вызовом метода init(), мне нужно бросить exception.

Может ли кто-нибудь помочь мне с тем, что exception должен ли я throw из concatString() Я думаю, что мы не можем бросить IIlegalArgumentException, так как в аргументе нет ничего плохого. Должен ли он быть null pointer exception?


person Alok    schedule 12.04.2014    source источник
comment
Похоже на дизайнерский запах. Вы должны вообще избегать неконечных статических полей и проектировать свой API таким образом, чтобы сделать такую ​​ситуацию невозможной. Например, вернуть объект из метода init(), а к этому объекту добавить метод concatString(). Таким образом, было бы невозможно конкатировать перед инициализацией.   -  person JB Nizet    schedule 12.04.2014


Ответы (3)


java.lang.IllegalStateException может вам помочь


PS. См. также статические инициализаторы в java. Возможно, это может помочь вам с инициализацией ваших статических полей.

person Philip Voronov    schedule 12.04.2014

Не ставьте требование вызывать init() для пользователей вашего класса. Либо вызывайте код в init() во время построения класса, либо вызывайте init() при вызове concatString(), например:

public static String concatString(String source)
{
    init();
    //concat string code.
    return concatedString;
}
person lreeder    schedule 12.04.2014

Вы должны создать собственное исключение для себя.
Это позволит вашему исключению содержать некоторую информацию в вашем контексте.

class MyConcatException extends Exception{
    private static final long serialVersionUID = 1L;

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

Применение:

public void MyMethod() throws MyConcatException
    {
        //do something
        throw new MyConcatException("target is not init");
    }

И вы получите:

MyConcatException: target is not init
    at Main.MyMethod(Main.java:16)
    at Main.main(Main.java:6)
person tana    schedule 12.04.2014