Java: Исключение, брошенное в конструктор, мой объект все еще может быть создан? - PullRequest
9 голосов
/ 06 мая 2011

Не могли бы вы сказать мне, может быть какой-то случай, когда исключение вызывает конструктор и объект не является нулевым.Я имею в виду, что какая-то часть объекта создана, а другая нет. Как это

public Test(){
name = "John";
// exception
// init some other data.
}

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

Ответы [ 4 ]

24 голосов
/ 06 мая 2011

Выражение создания экземпляра класса всегда создает новый объект, если оценка его спецификатора и аргументов завершается нормально, и если имеется достаточно места для создания объекта. Неважно, если конструктор выдает исключение; объект все еще создан. Выражение создания экземпляра класса в этом случае обычно не завершается, так как оно распространяет исключение.

Однако вы все равно можете получить ссылку на новый объект. Учтите следующее:

public class C {
    static C obj; // stores a "partially constructed" object
    C() {
        C.obj = this;
        throw new RuntimeException();
    }
    public static void main(String[] args) {
        C obj;
        try {
            obj = new C();
        } catch (RuntimeException e) {
            /* ignore */
        }
        System.out.println(C.obj);
    }
}

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

4 голосов
/ 06 мая 2011

Нет. Посмотрите на код клиента:

Test myObj = null;
try {
 myObj = new Test();
} catch(MyException e) {
  System.out.println("" + myObj);
}

Здесь, когда возникает исключение, операция '=' не выполняется. Ваш код идет прямо в блок catch, а myObj остается null.

2 голосов
/ 06 мая 2011

Нет. Если во время создания объекта возникает исключение, оно не будет создано.

В любом случае, вы бы это написали?

MyObject obj = new MyObject();
// This code will not be reachable in case of an Exception

или

MyObject obj = null;
try {
    obj = new MyObject();
} catch (AnyException e) {
}
// Here, either obj is created correctly, or is null as an Exception occurred.
0 голосов
/ 06 мая 2011
 public Test()
{  
name = "John"; 

     try{
 // exception 

// init some other data. 
}catch(AnyException e)
{
//catch
}


 }

Приведенный выше код имеет смысл согласно вашему ожиданию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...