0

我之所以有这个想法是因为 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;

谢谢你的任何回答,艾伦

4

3 回答 3

5

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

那么这是否意味着我也可以做这样的事情?:

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

或像这样投射一个对象?:

   (obj1 | obj2) someObject;

还是总是像这样指定对象?:

   obj1 | obj2 someName;

不,不,不。

该特殊语法只能在流行语“签名”的特定上下文中使用。

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

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

第一个对 and 执行按位 ORint2int3测试结果是否等于int1。如果我们用int1 == 0b0011,int2 == 0b0001和来尝试这个int3 == 0b0010bool1将会是true并且bool2将会是false

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

于 2015-10-24T23:47:27.700 回答
2
  • ||是逻辑运算符,只能应用于boolean值。
  • |是位运算符,也可以应用于整数类型。

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

异常情况下,Java 7 附带了这种构造。您现在可以用一条catch语句捕获多种异常类型。在这种情况下,竖线不是操作符,而是新结构的一个元素。

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

于 2015-10-24T23:49:01.580 回答
0

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

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

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

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

假设int1在二进制中 is 1111,而int2is1100int3is 0011。然后 statement1 将返回false,而 statement2 将返回true

于 2015-10-24T23:35:49.523 回答