Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int
:
int x;
x = 10;
В этом примере переменная x является int
, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.
Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:
Integer num;
num = new Integer(10);
Первая строка объявляет переменную с именем num
, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer
является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».
Во второй строке ключевое слово new
используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num
присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования .
(точка).
Exception
, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num
. Перед созданием объекта вы получите NullPointerException
. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.
Например, вы можете имеют следующий метод:
public void doSomething(SomeObject obj) {
//do something to obj
}
В этом случае вы не создаете объект obj
, скорее предполагая, что он был создан до вызова метода doSomething
. К сожалению, этот метод можно вызвать следующим образом:
doSomething(null);
В этом случае obj
имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException
, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.
Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething
может быть записано как:
/**
* @param obj An optional foo for ____. May be null, in which case
* the result will be ____.
*/
public void doSomething(SomeObject obj) {
if(obj != null) {
//do something
} else {
//do something else
}
}
Наконец, Как определить исключение & amp; причина использования Трассировки стека
Я верю тому, что Вы хотите, перечисление типа флага.
необходимо добавить, что Флаги приписывают вершине перечисления, и затем можно объединить перечисления с 'Или' ключевое слово.
Как это:
<Flags()> _
Enum CombinationEnums As Integer
HasButton = 1
TitleBar = 2
ReadOnly = 4
ETC = 8
End Enum
Примечание: числа направо являются всегда вдвое более большими (полномочия 2) - это необходимо, чтобы быть в состоянии разделить отдельные флаги, которые были установлены.
Объединение желаемые флаги с помощью Или ключевое слово:
Dim settings As CombinationEnums
settings = CombinationEnums.TitleBar Or CombinationEnums.Readonly
Это устанавливает TitleBar и Только для чтения в перечисление
Для проверки то, что было установлено:
If (settings And CombinationEnums.TitleBar) = CombinationEnums.TitleBar Then
Window.TitleBar = True
End If
Можно использовать FlagsAttribute для украшения Перечисления как поэтому, которое позволит Вам объединить Перечисление:
<FlagsAttribute> _
Public Enumeration SecurityRights
None = 0
Read = 1
Write = 2
Execute = 4
И затем называют их как так (класс UserPriviltes):
Public Sub New ( _
options As SecurityRights _
)
New UserPrivileges(SecurityRights.Read OR SecurityRights.Execute)
Они эффективно объединены (разрядная математика) так, чтобы вышеупомянутый пользователь и Считал И Выполняет все, которые несут вокруг в одной необычной переменной SecurityRights.
Для проверки, чтобы видеть, есть ли у пользователя полномочие, Вы используете И (более поразрядная математика) для проверки пользовательского перечисления значений с Перечисление значений, на которое Вы проверяете:
//Check to see if user has Write rights
If (user.Privileges And SecurityRights.Write = SecurityRigths.Write) Then
//Do something clever...
Else
//Tell user he can't write.
End If
HTH, Tyler
Popen.poll()
можно проверить, закончился ли процесс, то можно использовать communicate
. Таким образом, можно сохранить параллелизм.
– Diego Navarro
14 March 2012 в 17:07
Если я понимаю Ваш вопрос правильно, Вы хотите объединить различные перечислимые типы. Таким образом, одна переменная может сохранить значение от одного из права двух различных перечислений? Если Вы спрашиваете о хранении объединения двух различных значений одного перечислимого типа, можно посмотреть на объяснение Dave Arkell
, Перечисления являются просто целыми числами с небольшим количеством синтаксического сахара. Таким образом, если Вы удостоверитесь, что нет никакого перекрытия, которое можно объединить их путем кастинга к интервалу
, то Он не сделает для симпатичного кода все же. Я стараюсь не использовать перечисления большую часть времени. Обычно, если Вы позволяете перечислениям размножаться в Вашем коде, это - просто вопрос времени, прежде чем они родят повторные операторы выбора и другие грязные антишаблоны.
Если Вы берущий об использовании перечислимых флагов () существуете хорошая статья здесь .
.wait()
мог бы создать зомби : вообразите you' ve звонил .wait()
на процессе, который должен завершиться через час, и у Вас есть другие 1 000 детей, которые должны выйти через секунду. бум. you' ve получил 1 000 зомби за секунду это won' t пожинаться до передач часа.
– jfs
16 November 2013 в 21:13
Ключ к комбинации Enum
с должна удостовериться, что значение является питанием два (1, 2, 4, 8, и т.д.) так, чтобы можно было выполнить битовые операции на них (|=
&=
). Те Enum
с может быть быть отмеченной с Flags
атрибут. Anchor
свойство на элементах управления Windows Forms является примером такого управления. Если это будет отмечено как флаг, Visual Studio позволит Вам контрольные числа вместо того, чтобы выбрать единственное в выпадающем в разработчике свойств.
call
, потому что необходимо записать в stdin процесса, но Вас don' t заботятся о выводе? – Michael 20 July 2014 в 18:34