2015-10-24 7 views
0

Я получил эту идею из-за затмения (Java), где он показал возможность добавлять несколько исключений к статье улова, как это:Специальное использование «|» оператора, как прилов (NullPointerException | NumberFormatException е)

String someInput; 
int int1; 

try { 
    int1 = Integer.parseInt(someInput); 
} catch (NullPointerException | NumberFormatException e) { 
    e.printStackTrace; 
} 

Так ли это, что я могу также делать такие вещи, как это ?:

boolen bool1 = (int1 == (int2 | int3)); 

или отбрасывать объект, как это ?:

(obj1 | obj2) someObject; 

или ВСЕГДА указать объекты, как это ?:

obj1 | obj2 someName; 

спасибо за любые ответы, Айрен

+0

На каком языке программирования вы ссылаетесь? – iTayb

+0

Вы можете просто попробовать запустить этот код и посмотреть, работает ли он – CurlyCorvus

+0

Это зависит от языка программирования. Это не C++, и это не похоже на Java или C#. Что это? –

ответ

5

Использование | в фраз исключения исключений не является оператором. Это специальный синтаксис, который позволяет вам уловить набор исключений.

Так ли это, что я могу также делать такие вещи, как это ?:

boolean bool1 = (int1 == (int2 | int3)); 

или отбрасывать объект, как это ?:

(obj1 | obj2) someObject; 

или всегда указывать объекты, как это ?:

obj1 | obj2 someName; 

Нет, нет и нет.

Этот специальный синтаксис может только использоваться в контексте контекстной фразы «подпись».

Обратите внимание, что ваш первый пример синтаксически правильный, но он не делает то, что вы думаете. В частности, эти два утверждения означают разные вещи:

boolean bool1 = (int1 == (int2 | int3)); 
boolean bool2 = ((int1 == int2) || (int == int3)); 

Первой выполняет побитовое ИЛИ int2 и int3 и испытания, если результат равен int1.Если мы попробуем это с int1 == 0b0011, int2 == 0b0001 и int3 == 0b0010, bool1 будет true и bool2 будет false.

Другие два примера являются синтаксически неправильными (как выражения).

0

По крайней мере, в C++, два утверждения не являются эквивалентными:

statement1: (int1 == int2 || int1 == int3)

statement2: (int1 == (int2 | int3))

Оператор | является побитовым ИЛИ. То есть, (00001111 | 11110000) приведет к 11111111.

Скажем int1 в двоичном виде 1111, в то время как int2 является 1100 и int3 является 0011. Тогда инструкция1 вернет false, а statement2 вернется true.

+0

ОК спасибо, что отвечает на этот вопрос – Ayren

+0

| также является логическим оператором. Его версия без короткого замыкания || что означает, что даже если первое условие истинно, второе будет оценено. – user

2
  • || является логическим оператором и может только быть применены к boolean значений.
  • | является побитовым оператором и может быть применен к целочисленным типам.

Побитовые операторы выполняют операции над каждым битом целое число номер. Например: 5 | 6 = 7 (00000101 | 00000110 = 00000111). Он обычно используется для добавления и сравнения флагов, установленных на разных битах целочисленного числа (вместо массива логических значений).

В случае исключений, эта конструкция поставляется с Java 7. Теперь вы можете поймать несколько типов исключений с одним оператором catch. Вертикальная полоса в этом случае не является оператором, а скорее элементом новой конструкции.

Вы не можете использовать | (а не ||) в качестве операторов с объектами.