Проблема с областью действия оператора try catch - PullRequest
5 голосов
/ 29 сентября 2011

У меня проблема с n00b / basic о попытке отлова на java.

Ini myIni;
try {
    myIni = new Ini(new FileReader(myFile));
} catch (IOException e) {
    e.printStackTrace();
}

myIni.get("toto");

и следующее сообщение об ошибке: переменная myIni, возможно, не была инициализирована

Сфера действия попытки ограничена только областью попытки? Как я могу получить результат myIni в следующем коде?

Ответы [ 10 ]

6 голосов
/ 29 сентября 2011

Чтобы избежать сообщения, вам нужно установить значение по умолчанию перед оператором try.
Или вам нужно поместить вызов метода get() в операторе try.

4 голосов
/ 29 сентября 2011

Да, область действия попытки ограничена этим. Фактически область действия начинается с {и заканчивается}, таким образом, это также создаст под-область действия

void foo() {
  {
    Ini  myIni = new Ini(new FileReader(myFile));
  }

  myIni.get("toto"); //error here, since myIni is out of scope
}

Чтобы устранить проблему, инициализируйте myIni со значением null и помните, что в случае неудачной попытки myIni.get("toto"); приведет к исключению NullPointerException.

Так что вам нужно либо учесть это, либо выбросить другое исключение из вашего блока catch.

Проверка на ноль:

 Ini myIni = null;
 try {
   myIni = new Ini(new FileReader(myFile));
 } catch (IOException e) {
   e.printStackTrace();
 }

 if( myIni != null ) {
   myIni.get("toto");
   //access the rest of myIni
 } else {
   //handle initialization error
 }

Исключение броска:

 Ini myIni = null;
 try {
   myIni = new Ini(new FileReader(myFile));
 } catch (IOException e) {
   e.printStackTrace();
   throw new MyCustomInitFailedException(); //throw any exception that might be appropriate, possibly wrapping e
 }

 myIni.get("toto");

Как уже предложено @khachik, вы можете также поставить блок try вокруг всего использования myIni, если это возможно и уместно. Какое решение вы выберете, зависит от других ваших требований и вашего дизайна.

2 голосов
/ 29 сентября 2011

Правильный способ сделать то, что вы хотите, это поместить myIni.get("toto"); в блок try:

try {
    Ini myIni = new Ini(new FileReader(myFile));
    myIni.get("toto");
} catch (IOException e) {
    e.printStackTrace();
}

Не делайте Ini myIni = null; как некоторыепредложенные ответы.В этом случае ваш код будет выдавать NullPointerException, если при инициализации myIni.

выбрасывается IOException.
1 голос
/ 29 сентября 2011

Таким способом компилятор может сказать, что инициализация myIni может завершиться неудачно.Потому что строка myIni = new Ini(new FileReader(myFile)); может выдать исключение.

Если произойдет сбой при переходе на строку, myIni.get("toto"); myIni не будет инициализировано.

У вас есть 2 варианта:

  1. Поместите myIni.get("toto"); в блок try.
  2. Присвойте начальное значение null myIni, когдаВы определяете его и проверяете наличие null вне блока try.
1 голос
/ 29 сентября 2011

Область действия попытки ограничена только областью попытки?Ответ - да.Проблема, с которой вы столкнулись, заключается в том, что вы забыли инициализировать свой объект.

Попробуйте это:

Ini myIni=null;
try {
    myIni = new Ini(new FileReader(myFile));
} catch (IOException e) {
    e.printStackTrace();
}

Чтобы программа не получила NullPointerException, выполнив проверку, чтобы сделатьуверен, что вызванный в блоке try объект Object был собран с некоторыми данными.

if(myIni !=null) 
 {
   myIni.get("toto");
 }

Альтернатива, если вы не хотите вызывать myIni вне блока try / catch, поскольку в случае возникновения исключения объект будет null, тогда вы можете сделать следующее:

try {
    Ini myIni= new Ini(new FileReader(myFile));
    myIni.get("toto");
} catch (IOException e) {
    e.printStackTrace();
}
0 голосов
/ 29 сентября 2011

Как указал @khachik, лучше всего объявить и инициализировать переменную внутри самого блока try. Инициализируйте, как показано ниже, за пределами «бокса», только если вы чувствуете в себе абсолютную уверенность, которая неотличима от высокомерия.

Ini myIni = null;
0 голосов
/ 29 сентября 2011

в вашем коде, если происходит исключение, переменная myIni не может быть создана, поэтому компилятор выдает такое предупреждение.

вы можете изменить его на:

Ini myIni = null;
try {
    myIni = new Ini(new FileReader(myFile));
} catch (IOException e) {
    e.printStackTrace();
}
if(myIni!=null){
myIni.get("toto");
}
0 голосов
/ 29 сентября 2011

В операторе catch вы не определяете значение переменной.Следовательно, переменная не будет иметь значения, если вы поймаете, а затем запустите myIni.get("toto");.Вы хотели бы сделать что-то вроде этого:

Ini myIni = null;
try {
    myIni = new Ini(new FileReader(myFile));
} catch (IOException e) {
    e.printStackTrace();
}

myIni.get("toto");

Тем не менее, вы получите NPE при запуске get().

0 голосов
/ 29 сентября 2011

напишите Ini myIni = null; и все

0 голосов
/ 29 сентября 2011

Просто поместите myIni.get ("toto") внутри блока try catch или напишите Ini myIni = null; в первом ряду. Обратите внимание, что если вы сделаете второй вариант, вы можете получить исключение NullPointerException, если файл не найден или не может быть прочитан по любой другой причине ...

ура! P

...