Здравствуйте, fflush, Вы писали:
F>Возник спор не на жизнь, а на смерть, приводит ли к потери памяти вызов эксепшена из конструктора в Java. Деструкторов-то понятно нет, но будет ли память из-под текущего объекта очищена, ведь объект фактически не существовал? F>Как проверить не знаю, может подскажете?
Конечно будет очищена, кто же такую личинку оставит? Если память была выделена под объект, но при инициализации объекта произошло исключение, то это никак не повлияет на работа GC. Если ссылок на объект не будет — он соберется. Если будут, то не соберется. Откуда утечке-то взяться?
Что значит "объект фактически не существовал". Память выделили? Выделили. Значит объект существовал. Пусть и с не валидными значениями. А перед выделением памяти происходит проверка. Если пямяти не хватает, то объект не будет создаваться.
В чем причина спора? Или 2 программиста на плюсах поспорили про объекты в яве?
public class MemTest
{
private static boolean gc = false;
public MemTest(Object[] store)
{
store[0] = this; //Сохраняем ссылку на объектthrow new RuntimeException(); //Бросаем исключение
}
public static void main(String[] args)
{
Object[] store = new Object[1]; //Создаём хранилищеtry
{
new MemTest(store); //Пытаемся создать объект
}
catch(Exception e)
{
System.out.println("Exception");//Произошло исключение
System.out.println("Object: " + store[0]); //Имеем ссылку на объект не null
//Убиваем ссылку, чтобы объект ыл доступен мусорщику
store[0] = null;
}
//Пока объект не собранwhile(!gc)
{
try
{
Thread.sleep(200);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
// Пытаемся разбудеить GC
System.gc();
}
}
//Метод вызывается перед тем как объект будет удален из памяти.protected void finalize() throws Throwable
{
System.out.println("Collecting...");
gc = true;
}
}
Возник спор не на жизнь, а на смерть, приводит ли к потери памяти вызов эксепшена из конструктора в Java. Деструкторов-то понятно нет, но будет ли память из-под текущего объекта очищена, ведь объект фактически не существовал?
Как проверить не знаю, может подскажете?
========
we are not an approved substitute for your brain (from #c++ on irc.gnu.org)
Re: Java + Exception в конструкторе.
От:
Аноним
Дата:
11.05.04 19:24
Оценка:
Здравствуйте, fflush, Вы писали:
F>Возник спор не на жизнь, а на смерть, приводит ли к потери памяти вызов эксепшена из конструктора в Java. Деструкторов-то понятно нет, но будет ли память из-под текущего объекта очищена, ведь объект фактически не существовал? F>Как проверить не знаю, может подскажете?
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, fflush, Вы писали:
[...] B>В чем причина спора? Или 2 программиста на плюсах поспорили про объекты в яве?
Много раз наблюдал подобные споры... В случае с двумя Java-разработчиками обычно обсуждается культурный аспект. Что скажешь по этому поводу как эксперт?
Здравствуйте, A_Gura, Вы писали:
A_G>Много раз наблюдал подобные споры... В случае с двумя Java-разработчиками обычно обсуждается культурный аспект. Что скажешь по этому поводу как эксперт?
Здравствуйте, A_Gura, Вы писали:
A_G>Здравствуйте, Blazkowicz, Вы писали:
B>>Не понял вопроса. Чего сказать-то?
A_G> Можно ли (нужно ли) возбуждать исключения в конструкторах?
Можно... и нужно... А как еще сообщить клиенту, что объект не может быть сконструирован?
вводить специальный метод для этих целей?
Либо же лепить пустые конструкторы и использовать везде метод типа initalize()...
Тем более, если мы посмотрим на стнадартную библиотеку классов, так это там сплошь и рядом...