Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Мое основное использование для побитовых операторов могло быть релевантным где угодно - представление ряда флагов. Например, у Вас могло бы быть целое число в базе данных, представляющей ряд прав доступа для пользователя, и в Вашем веб-приложении необходимо будет проверить тех перед продолжением.
Те склонны только требовать &
и |
- например,
if ((permissions & Permission.CreateUser) != 0)
{
...
}
или
Permission requiredPermission = Permission.CreateUser
| Permission.ChangePassword;
Бит смещение , операторы менее полезны в "бизнес-" приложениях, по моему опыту.
Я собираюсь быть более явным здесь, потому что я думаю, что поразрядные маски являются большим инструментом, который должен быть в любом devs поясе. Я собираюсь попытаться подробно остановиться на ответах выше. Во-первых, пример использования целого числа для поддержания флагов состояния (общее использование):
// These are my masks
private static final int MASK_DID_HOMEWORK = 0x0001;
private static final int MASK_ATE_DINNER = 0x0002;
private static final int MASK_SLEPT_WELL = 0x0004;
// This is my current state
private int m_nCurState;
К [1 118] устанавливает мое состояние, я использую оператор битового "ИЛИ":
// Set state for'ate dinner' and 'slept well' to 'on'
m_nCurState = m_nCurState | (MASK_ATE_DINNER | MASK_SLEPT_WELL);
Уведомление, как я 'или' мое текущее состояние в с состояниями, которые я хочу включить. Кто знает то, что мое текущее состояние, и я не хочу сдувать его.
К [1 119] сбрасывает мое состояние, я использую поразрядную операцию И с дополнительным оператором:
// Turn off the 'ate dinner' flag
m_nCurState = (m_nCurState & ~MASK_ATE_DINNER);
К [1 120] проверка мое текущее состояние, я использую операцию И:
// Check if I did my homework
if (0 != (m_nCurState & MASK_DID_HOMEWORK)) {
// yep
} else {
// nope...
}
, Почему я думаю, что это интересно? Скажите, что я разрабатываю интерфейс, который устанавливает мое состояние. Я мог записать метод, который принимает три булевских переменные:
void setState( boolean bDidHomework, boolean bAteDinner, boolean bSleptWell);
Или, я мог использовать единственное число, чтобы представить все три состояния и передать единственное значение:
void setState( int nStateBits);
при выборе второго шаблона Вы будете очень счастливы, когда решат добавить другое состояние - Вы не должны будете повреждать существующий impls своего интерфейса.
Мои два цента. Спасибо.
Для программистов Java xor побитовый оператор (^) обеспечивает полезный способ кодировать тест исключающего ИЛИ между двумя булевскими переменными. Пример:
boolean isFoo = ...
boolean isBar = ...
if (isFoo ^ isBar) {
// Either isFoo is true or isBar is true, but not both.
Примечание: нет никакой фактической побитовой обработки, продолжающейся здесь, но это - полезный способ использовать xor побитовый оператор (в ярусе веб-узлов или где-либо еще).
(То же может относиться к C#, так как это настолько подобно Java. Не уверенный, все же.)
Кроме того, от флагов, нет большой причины использовать битовые операции в языках сценариев. Но как только Вы копаетесь в более низких уровнях своего стека, битовые операции становятся все более очень важными.
Обычно Вы не должны касаться об операциях на разрядном уровне. Можно думать в байтах, ints, удваивается, и другие высокоуровневые типы данных. Но существуют времена, когда требуется быть в состоянии перейти к уровню отдельного бита.
Один из наиболее распространенных случаев использования побитовых операторов флаги (php пример). Эти побитовые операторы также используются в двоичном файле операции IO.
Я использую их время от времени, но никогда в местах, где я могу избежать их. Чаще всего я использовал их, следящий за двумя ситуациями.
На вне темы стороне вещей, на высокоуровневых языках, особенно на проанализированных языках (таких как PHP), битовые операции являются тоннами медленнее <глоток> [необходима цитата] глоток>, чем нормальная арифметика. Так, в то время как проверка разрешения Jon могла бы быть в порядке с точки зрения производительности, это не является 'очень собственным' в веб-домене.
Единственное время я должен был использовать их за пределами авторизации доступа, было для проекта, который я делал для синтаксического анализатора, который взял Цветные идентификаторы, присвоенные ints
, т.е.
$color_red= 1;
$color_blue = 2;
$color_yellow = 8;
$color_purple = 3;
$color_orange = 9;
$color_green = 10;
тогда мне дали, свойство
$can_collect_200_dollars = 10;
тогда раньше поразрядно сравнивало цвет, данный со свойством
if($given_color & $can_collect_200_dollars)
{
$yay_i_got_200_dollars = true;
}else{
$bummer_i_am_going_to_jail = true;
}
Я думаю, что побитовые операторы очень сильны, если их использовать разумно.
Предположим, у вас есть «Интернет-магазин». И некоторые из ваших элементов попадают в несколько категорий.
Либо вам нужно создать отношение «многие ко многим». Или вы можете дать своим категориям дополнительный двоичный идентификатор, а в вашем продукте просто сохранить побитовую комбинацию идентификаторов категорий
. Я думаю, что в нескольких строках я не могу подробно объяснить. ИЗВИНИТЕ