powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / java основы
8 сообщений из 33, страница 2 из 2
java основы
    #34285567
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
java основы
    #34285569
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fjord Dremmmm fjordв том то и дело что массив заполняется до 4, и по идее пятый элемент должен быть null, но выдается 0
100 пудов, надо лучше книжки читать
Blazkowicz правильно писал "null это не тип, а значение по умолчанию. Только у int оно 0, а не null"так я и читаю )) и по ходу чтения возникают вопросы
получается что
Код: plaintext
 int  b;
тоже получает значение по умолчанию 0, однако если сделать
Код: plaintext
1.
 int  b;
System.out.println(b);
то компилятор скажет что переменная b не проинициализированна, а
Код: plaintext
 int  a[] =  new   int [ 7 ];
инициализирует массив нулями?
при объявлении переменной типа int в классе она инициализируется нулем, при объявлении массива int они инициализируются нулями, при объявлении локальной переменной int (внутри метода) она инициализируется случайным значением, мусором, бывшим в памяти при выделении места под переменную, и чтобы избежать ошибок, компилятор проверяет, чтобы это "случайное значение" не использовалось. В книгах все это давно описано. Читать, читать и читать.
...
Рейтинг: 0 / 0
java основы
    #34285571
fjord
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все понял. всемо спасибо :)
...
Рейтинг: 0 / 0
java основы
    #34285575
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fjordтак я и читаю )) и по ходу чтения возникают вопросы
получается что
Код: plaintext
 int  b;
тоже получает значение по умолчанию 0, однако если сделать
Код: plaintext
1.
 int  b;
System.out.println(b);
то компилятор скажет что переменная b не проинициализированна, а
Код: plaintext
 int  a[] =  new   int [ 7 ];
инициализирует массив нулями?

А ты ещё спецификацию скачай и полистай на досуге.
Поля инитятся значениями по умолчанию. Элементы массива тоже. А вот локальные переменные значениями по умолчанию не инитятся. Вот всё. А ты сразу как загнул про "тип примитивной переменной".
...
Рейтинг: 0 / 0
java основы
    #34285582
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зашедшийпри объявлении локальной переменной int (внутри метода) она инициализируется случайным значением, мусором, бывшим в памяти при выделении места под переменную

Откуда дровишки?
...
Рейтинг: 0 / 0
java основы
    #34285645
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОткуда дровишки? Тоже интересно почитать...
...
Рейтинг: 0 / 0
java основы
    #34285709
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz Зашедшийпри объявлении локальной переменной int (внутри метода) она инициализируется случайным значением, мусором, бывшим в памяти при выделении места под переменную

Откуда дровишки?
Собственно в спецификации JVM это никак не упоминается, там просто выставлено ограничение на использование неинициализированных локальных переменных, но был такой баг в Symantec JIT-compiler. Последний позволял через редактирование байт-кода использовать неинициализированные локальные переменные, в том числе, например, и ссылки на объекты. В итоге указатели показывали куда попало. Баг починили, конечно :)
...
Рейтинг: 0 / 0
java основы
    #34285721
Зашедший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде про это как раз:
Some remarks:
1. I use boolean, and for 32-bit-values double checking is ok, even in the link.

2. The inspection do not bother me, they reports too many warnings. But we have the goal to get only green code without warnings. And since 833 it reports doublechecking.

3. The JVM-Spec requires that its not allowed to use a noninitialized object, it do not allow a use (= a store)
of this uninitialized object
http://java.sun.com/docs/books/vmspec/2nd-edition/html/ClassFile.doc.html#9839

I've tested it (with bcel): the byte code verifier refuse with an "Expecting to find object/array on stack"-exception, if you try to store an object to a field before the initialization:

new #1 // java.lang.Object
dup
putstatic #2 // a static field
invokespecial #1 // Constructor



Same with nonstatic fields, but ok with local variables
(because that cant be accessed from another thread [or threat ;-) ])

So the Symantec JIT-compiler is not correct. Consider, if the constructor takes long value, you may access the object before initialization, or with malicious byte code you can create invalid strings (place in the bytecode between new and invokespecial a Thread.sleep which is ok).
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / java основы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]