Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
я сделал еще некоторую работу над этими расширениями - можно найти код здесь
, я записал некоторые дополнительные методы, которые расширяют Систему. Перечисление, которое я часто использую... Я не утверждаю, что они являются пуленепробиваемыми, но они помогли... Комментарии удалены...
namespace Enum.Extensions {
public static class EnumerationExtensions {
public static bool Has<T>(this System.Enum type, T value) {
try {
return (((int)(object)type & (int)(object)value) == (int)(object)value);
}
catch {
return false;
}
}
public static bool Is<T>(this System.Enum type, T value) {
try {
return (int)(object)type == (int)(object)value;
}
catch {
return false;
}
}
public static T Add<T>(this System.Enum type, T value) {
try {
return (T)(object)(((int)(object)type | (int)(object)value));
}
catch(Exception ex) {
throw new ArgumentException(
string.Format(
"Could not append value from enumerated type '{0}'.",
typeof(T).Name
), ex);
}
}
public static T Remove<T>(this System.Enum type, T value) {
try {
return (T)(object)(((int)(object)type & ~(int)(object)value));
}
catch (Exception ex) {
throw new ArgumentException(
string.Format(
"Could not remove value from enumerated type '{0}'.",
typeof(T).Name
), ex);
}
}
}
}
Тогда они используются как следующий
SomeType value = SomeType.Grapes;
bool isGrapes = value.Is(SomeType.Grapes); //true
bool hasGrapes = value.Has(SomeType.Grapes); //true
value = value.Add(SomeType.Oranges);
value = value.Add(SomeType.Apples);
value = value.Remove(SomeType.Grapes);
bool hasOranges = value.Has(SomeType.Oranges); //true
bool isApples = value.Is(SomeType.Apples); //false
bool hasGrapes = value.Has(SomeType.Grapes); //false
Идиома должна использовать поразрядное или - равный оператор для установки битов:
flags |= 0x04;
Для очистки немного идиома должна использовать поразрядно и с отрицанием:
flags &= ~0x04;
Иногда у Вас есть смещение, которое определяет Ваш бит, и затем идиома должна использовать, они объединились со сдвигом влево:
flags |= 1 << offset;
flags &= ~(1 << offset);
Синтаксис C++, принимая бит 0 является LSB, принятие отмечает, не подписано долго:
Проверка, если Установлено:
flags & (1UL << (bit to test# - 1))
Проверка, если не набор:
invert test !(flag & (...))
Набор:
flag |= (1UL << (bit to set# - 1))
Ясный:
flag &= ~(1UL << (bit to clear# - 1))
Переключатель:
flag ^= (1UL << (bit to set# - 1))
Для тестирования немного, Вы сделали бы следующее: (принимающие флаги являются числом на 32 бита)
, Тест Укусил:
if((flags & 0x08) == 0x08)
(Если бит 4 установлен тогда его истинное), Переключатель Назад (1 - 0 или 0 - 1): flags = flags ^ 0x08;
Обнуленный Бит 4: flags = flags & 0xFFFFFF7F;
Операции C++: & | ^ ~ (для и, или, xor и не битовые операции). Также интереса>> и < < которые являются операциями сдвига разряда.
Так, для тестирования некоторое время быть установленным во флаге Вы использовали бы: если (отмечает & 8)//тесты укусили 4, был установлен