“|”运算符的特殊用法,如 catch (NullPointerException | NumberFormatException e)

Special usage of " | " operator, like catch (NullPointerException | NumberFormatException e)

我有这个想法是因为 eclipse (Java),它显示了向 catch 子句添加多个异常的可能性,如下所示:

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;

感谢您的任何回答, 艾伦

至少在C++中,这两个语句是不等价的:

声明 1 : (int1 == int2 || int1 == int3)

声明 2:( int1 == (int2 | int3) )

运营商|是按位或。也就是说,(00001111 | 11110000) 将导致 11111111

假设 int1 在二进制中是 1111,而 int21100int30011。 然后语句 1 将 return false,而语句 2 将 return true.

在异常标语中使用 | 不是运算符。它是一种特殊的语法,可让您捕获一组异常。

So does that mean that i can also do stuff like that?:

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

or cast an object like this?:

   (obj1 | obj2) someObject;

or always specify Objects like this?:

   obj1 | obj2 someName;

不不不不

该特殊语法 只能 用于流行语的特定上下文 "signature"。

请注意,您的第一个示例在语法上是正确的,但它并没有按照您的想法进行。具体来说,这两个语句意味着不同的东西:

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

第一个执行 int2int3 的按位或并测试结果是否等于 int1。如果我们尝试使用 int1 == 0b0011int2 == 0b0001int3 == 0b0010bool1 将是 truebool2 将是 false

其他两个示例在语法上不正确(作为表达式)。

  • || 是一个逻辑运算符,只能 应用于 boolean 值。
  • | 是按位运算符,也可以应用于 整数 类型。

按位运算符对 整数 数的每一位执行运算。例如:5 | 6 = 7 (00000101 | 00000110 = 00000111)。它通常用于添加和比较在整数的不同位上设置的标志(而不是布尔数组)。

异常的情况下,此构造附带Java 7。您现在可以使用单个catch语句捕获多种异常类型。本例中的竖线不是运算符,而是新结构的一个元素。

但是,您不能将 |(也不 ||)用作对象的运算符。