Java: как получить доступ к назначениям в try-catch -loop? - PullRequest
3 голосов
/ 13 апреля 2010

Проблема сводит меня к большим циклам try-catch. Я хочу поменьше. Так как же получить доступ к назначениям в циклах?

$ javac TestInit2.java 
TestInit2.java:13: variable unknown might not have been initialized
  System.out.println(unknown);
                     ^
1 error

Код

import java.util.*;
import java.io.*;

public class TestInit2 {

 public static void main(String[] args){
  String unknown;
  try{
   unknown="cannot see me, why?";
  }catch(Exception e){
   e.printStackTrace();
  }
  System.out.println(unknown);
 }
}

Ответы [ 5 ]

9 голосов
/ 13 апреля 2010

Вам необходимо присвоить начальное значение unknown (в этом случае я использовал null, но не стесняйтесь назначать любое значение, которое имеет смысл для вашего приложения):

import java.util.*;
import java.io.*;

public class TestInit2 {

    public static void main(String[] args){
        String unknown = null;
        try{
            unknown="cannot see me, why?";
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println(unknown);
    }
}

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

4 голосов
/ 13 апреля 2010

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

Вам нужно будет присвоить переменную чему-либо перед ее использованием. Однако можно просто присвоить ему значение NULL, если вы хотите, чтобы оно было NULL в случае сбоя назначения.

Итак, если вы хотите, чтобы переменная была нулевой, если присваивание не выполнено, попробуйте это:

    String unknown = null;
    try{
        unknown="cannot see me, why?";
    }catch(Exception e){
        e.printStackTrace();
    }
    System.out.println(unknown);

Если вы хотите установить переменную на что-то другое, если возникнет исключение, попробуйте это:

    String unknown;
    try{
        unknown="cannot see me, why?";
    }catch(Exception e){
        e.printStackTrace();
        unknown = "exception caught";
    }
    System.out.println(unknown);        

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

    String unknown;
    try{
        unknown="cannot see me, why?";
    }catch(Exception e){
        e.printStackTrace();
        //return; // if you just want to give up with this method, but not bother breaking the flow of the caller
        throw new Exception("Uh-oh...", e); // if you want to be sure the caller knows something went wrong
    }
    System.out.println(unknown);   
3 голосов
/ 13 апреля 2010

Вы пытаетесь установить значение этой переменной, которое не было инициализировано. Это означает, что, если при попытке выполнить это назначение было обнаружено исключение, назначение не произошло бы, и переменная осталась бы неинициализированной. Чтобы избавиться от ошибки, объявите переменную как:

String unknown = null;

Таким образом, по крайней мере, println сможет что-то решить.

2 голосов
/ 13 апреля 2010

Вы никогда не дадите unknown значение при его объявлении, даже null. Компилятор не знает, что происходит в блоке try, и не может гарантировать, что что-то внутри происходит. Итак, насколько ему известно, unknown не ссылается ни на что, пока ваш println() не ударит.

РЕДАКТИРОВАТЬ: Чтобы уточнить, все, что знает компилятор, - это то, что исключение может быть выдано в любой точке во время блока try, поэтому он не может предполагать, что то, что вы вставили туда, будет успешным.

1 голос
/ 13 апреля 2010

Ключевое слово в сообщении компилятора: может . Это не означает, что переменная не может быть инициализирована при обращении к переменной в вызове println, просто есть вероятность, что это не произойдет, поэтому компилятор жалуется.

...