Java поле ініцыялізацыя да функцый, якія кідаюць выключэнне

У мяне ёсць праблема, якая зніжае да разгляду гэтага класа:

class myClass
{
    static int s_int = getInteger();

    static int getInteger() throws myClassException
    {
        ...

Вось мая праблема: гэта не будзе кампілявацца, так як GetInteger() кідае myClassException і не паспрабаваць злавіць блок пры ініцыялізацыі s_int .

Адно рашэнне, вядома, было б пабудаваць getIntegerAndDealWithTheException() , які не выкідвае выключэнне і выкліку, што замест таго, каб пры ініцыялізацыі s_int. Але я палічыў за лепшае б не так, што гэта не так прыгожа: Я палічыў за лепшае б не засмечваць код з заглушкамі.

Ці магу я прапусціць палегчаную запіс трука тут з маёй ініцыялізацыяй s_int?

Вялікі дзякуй!

1

15 адказы

Вы можаце выкарыстоўваць статычны инициализатор . Статычны инициализатор блок кода паміж статычны { і } выкарыстоўваецца для ініцыялізацыі статычныя зменныя, якія прымаюць больш кода, чым простая дэкларацыя і выразы ,

class myClass
{
    static int s_int;

    static
    {
       try {
          s_int = getInteger();
       } catch (myClassException e) {
         //Handle it here.
       }
    }

    static getInteger() throws myClassException
    {
        ...

Статычныя инициализаторы не можа кінуць правяраемых выключэнняў, у адпаведнасці з JLS 11.2.3 . цытую:

<�Р> Гэта памылка часу кампіляцыі, калі зменная инициализатор класа (§8.3.2) або   статычны инициализатор (§ 8.7) з названага класа або інтэрфейсу можа кінуць   праверыў клас выключэнні.

Такім чынам, вы павінны злавіць Exception , што азначае, што вам трэба больш, чым простая дэкларацыя і выразы, таму статычны инициализатор робіць працу тут.

2
дададзена

Вы можаце выкарыстоўваць статычны инициализатор . Статычны инициализатор блок кода паміж статычны { і } выкарыстоўваецца для ініцыялізацыі статычныя зменныя, якія прымаюць больш кода, чым простая дэкларацыя і выразы ,

class myClass
{
    static int s_int;

    static
    {
       try {
          s_int = getInteger();
       } catch (myClassException e) {
         //Handle it here.
       }
    }

    static getInteger() throws myClassException
    {
        ...

Статычныя инициализаторы не можа кінуць правяраемых выключэнняў, у адпаведнасці з JLS 11.2.3 . цытую:

<�Р> Гэта памылка часу кампіляцыі, калі зменная инициализатор класа (§8.3.2) або   статычны инициализатор (§ 8.7) з названага класа або інтэрфейсу можа кінуць   праверыў клас выключэнні.

Такім чынам, вы павінны злавіць Exception , што азначае, што вам трэба больш, чым простая дэкларацыя і выразы, таму статычны инициализатор робіць працу тут.

2
дададзена

Вы павінны разгледзець чытанне кіраўніка «Выкарыстанне неправераных expetions» кнігі «Чысты код» ад Роберта С. Марціна. Пасля гэтага я не думаю, што вы будзеце мець такога роду праблемы.

1
дададзена

Вы павінны разгледзець чытанне кіраўніка «Выкарыстанне неправераных expetions» кнігі «Чысты код» ад Роберта С. Марціна. Пасля гэтага я не думаю, што вы будзеце мець такога роду праблемы.

1
дададзена

Вы павінны разгледзець чытанне кіраўніка «Выкарыстанне неправераных expetions» кнігі «Чысты код» ад Роберта С. Марціна. Пасля гэтага я не думаю, што вы будзеце мець такога роду праблемы.

1
дададзена

Вы павінны разгледзець чытанне кіраўніка «Выкарыстанне неправераных expetions» кнігі «Чысты код» ад Роберта С. Марціна. Пасля гэтага я не думаю, што вы будзеце мець такога роду праблемы.

1
дададзена

Я спынюся крыху аб тым, што рабіць, калі вы ловіце выключэнне.

Ініцыялізацыі класа павінны быць змешчаны ўнутр статычнага инициализатора. Як папярэджвае кампілятар, вы не можаце пакінуць неперехваченное выключэнне ўнутры статычнага инициализатора. Вы павінны злавіць яго і зрабіць што-то з ім. Калі вы не можаце акрыяць ад выключэння, то ваш клас не ініцыялізаваны. Тады вы павінны кінуць ExceptionInInitializerError , які сігналізуе, што класы стан з'яўляецца несапраўдным.

class MyClass {
    static int s_int;

static {
    try {
        s_int = getInteger();
    catch (MyClassException e) {
        throw new ExceptionInInitializerError(e);
       //or if it is ok, s_it = some_default_value; 
    }

static int getInteger() throws MyClassException {
   ...

Here you can find a more detailed explanation.

1
дададзена

Я спынюся крыху аб тым, што рабіць, калі вы ловіце выключэнне.

Ініцыялізацыі класа павінны быць змешчаны ўнутр статычнага инициализатора. Як папярэджвае кампілятар, вы не можаце пакінуць неперехваченное выключэнне ўнутры статычнага инициализатора. Вы павінны злавіць яго і зрабіць што-то з ім. Калі вы не можаце акрыяць ад выключэння, то ваш клас не ініцыялізаваны. Тады вы павінны кінуць ExceptionInInitializerError , які сігналізуе, што класы стан з'яўляецца несапраўдным.

class MyClass {
    static int s_int;

static {
    try {
        s_int = getInteger();
    catch (MyClassException e) {
        throw new ExceptionInInitializerError(e);
       //or if it is ok, s_it = some_default_value; 
    }

static int getInteger() throws MyClassException {
   ...

Here you can find a more detailed explanation.

1
дададзена

Я спынюся крыху аб тым, што рабіць, калі вы ловіце выключэнне.

Ініцыялізацыі класа павінны быць змешчаны ўнутр статычнага инициализатора. Як папярэджвае кампілятар, вы не можаце пакінуць неперехваченное выключэнне ўнутры статычнага инициализатора. Вы павінны злавіць яго і зрабіць што-то з ім. Калі вы не можаце акрыяць ад выключэння, то ваш клас не ініцыялізаваны. Тады вы павінны кінуць ExceptionInInitializerError , які сігналізуе, што класы стан з'яўляецца несапраўдным.

class MyClass {
    static int s_int;

static {
    try {
        s_int = getInteger();
    catch (MyClassException e) {
        throw new ExceptionInInitializerError(e);
       //or if it is ok, s_it = some_default_value; 
    }

static int getInteger() throws MyClassException {
   ...

Here you can find a more detailed explanation.

1
дададзена

Я спынюся крыху аб тым, што рабіць, калі вы ловіце выключэнне.

Ініцыялізацыі класа павінны быць змешчаны ўнутр статычнага инициализатора. Як папярэджвае кампілятар, вы не можаце пакінуць неперехваченное выключэнне ўнутры статычнага инициализатора. Вы павінны злавіць яго і зрабіць што-то з ім. Калі вы не можаце акрыяць ад выключэння, то ваш клас не ініцыялізаваны. Тады вы павінны кінуць ExceptionInInitializerError , які сігналізуе, што класы стан з'яўляецца несапраўдным.

class MyClass {
    static int s_int;

static {
    try {
        s_int = getInteger();
    catch (MyClassException e) {
        throw new ExceptionInInitializerError(e);
       //or if it is ok, s_it = some_default_value; 
    }

static int getInteger() throws MyClassException {
   ...

Here you can find a more detailed explanation.

1
дададзена

Вы можаце ініцыялізаваць статычныя атрыбуты ўнутры класа статычнага блока.

У вашым выпадку:

class myClass
{
    static int s_int;

    static {
        try {
            s_int = getInteger();
        } catch (myClassException e) {
           //exception handling code
        }
    }

    static getInteger() throws myClassException
    {
        ...
1
дададзена
не маглі б вы крыху распрацоўкі? Ta. Ах, вы толькі што зрабілі.
дададзена аўтар Bathsheba, крыніца
Як вы можаце бачыць, што ёсць вялікая канкурэнцыя паміж людзьмі, адказваючы на ​​пытанні на SO, пастаянная барацьба з часам, таму я спачатку забяспечыць кароткі адказ, а затым падоўжыць яго :)
дададзена аўтар Adam Siemion, крыніца

Можна (але, верагодна, не павінны) выкарыстаць статычны блок:

class myClass {

    static int s_int;
    static {
        try {
           s_int = getInteger();
        }
        catch(Exception e) {
           //...
        }
    }

}

Альтэрнатывай з'яўляецца гультаяватымі нагрузкамі значэння.

class myClass {

    static Integer s_int = null;

    public static int getInteger() throws Exception {
        if(s_int == null) {
            s_int = /* ? */
        }
        return s_int;
    }

    public static void wtv() {
       //never refer to the static member - use the method,
       //which will lazy-load the value
        int s_int = getInteger();
    }

    public static void doSomething() {
       //never refer to the static member - use the method,
       //which will lazy-load the value
        int s_int = getInteger();
    }

}

... і затым заўсёды ставяцца да GetInteger() , ніколі непасрэдна да статычнаму сябру.

0
дададзена

Можна (але, верагодна, не павінны) выкарыстаць статычны блок:

class myClass {

    static int s_int;
    static {
        try {
           s_int = getInteger();
        }
        catch(Exception e) {
           //...
        }
    }

}

Альтэрнатывай з'яўляецца гультаяватымі нагрузкамі значэння.

class myClass {

    static Integer s_int = null;

    public static int getInteger() throws Exception {
        if(s_int == null) {
            s_int = /* ? */
        }
        return s_int;
    }

    public static void wtv() {
       //never refer to the static member - use the method,
       //which will lazy-load the value
        int s_int = getInteger();
    }

    public static void doSomething() {
       //never refer to the static member - use the method,
       //which will lazy-load the value
        int s_int = getInteger();
    }

}

... і затым заўсёды ставяцца да GetInteger() , ніколі непасрэдна да статычнаму сябру.

0
дададзена

Можна (але, верагодна, не павінны) выкарыстаць статычны блок:

class myClass {

    static int s_int;
    static {
        try {
           s_int = getInteger();
        }
        catch(Exception e) {
           //...
        }
    }

}

Альтэрнатывай з'яўляецца гультаяватымі нагрузкамі значэння.

class myClass {

    static Integer s_int = null;

    public static int getInteger() throws Exception {
        if(s_int == null) {
            s_int = /* ? */
        }
        return s_int;
    }

    public static void wtv() {
       //never refer to the static member - use the method,
       //which will lazy-load the value
        int s_int = getInteger();
    }

    public static void doSomething() {
       //never refer to the static member - use the method,
       //which will lazy-load the value
        int s_int = getInteger();
    }

}

... і затым заўсёды ставяцца да GetInteger() , ніколі непасрэдна да статычнаму сябру.

0
дададзена

Можна (але, верагодна, не павінны) выкарыстаць статычны блок:

class myClass {

    static int s_int;
    static {
        try {
           s_int = getInteger();
        }
        catch(Exception e) {
           //...
        }
    }

}

Альтэрнатывай з'яўляецца гультаяватымі нагрузкамі значэння.

class myClass {

    static Integer s_int = null;

    public static int getInteger() throws Exception {
        if(s_int == null) {
            s_int = /* ? */
        }
        return s_int;
    }

    public static void wtv() {
       //never refer to the static member - use the method,
       //which will lazy-load the value
        int s_int = getInteger();
    }

    public static void doSomething() {
       //never refer to the static member - use the method,
       //which will lazy-load the value
        int s_int = getInteger();
    }

}

... і затым заўсёды ставяцца да GetInteger() , ніколі непасрэдна да статычнаму сябру.

0
дададзена