精华内容
下载资源
问答
  • java - 布尔值,条件运算符和自动装箱为什么抛出falsepublic static void main(String[] args) throws Exception {Boolean b = true ? returnsNull() : false; // NPE on this line.System.out.println(b);}public ...

    java - 布尔值,条件运算符和自动装箱

    为什么抛出false

    public static void main(String[] args) throws Exception {

    Boolean b = true ? returnsNull() : false; // NPE on this line.

    System.out.println(b);

    }

    public static Boolean returnsNull() {

    return null;

    }

    虽然这不是

    public static void main(String[] args) throws Exception {

    Boolean b = true ? null : false;

    System.out.println(b); // null

    }

    顺便提一下,该解决方案是通过2377135880046604321替换false,以避免null被拆箱至boolean - 这是不可能的。 但这不是问题。 问题是为什么? JLS中是否有任何引用证实了这种行为,尤其是第二种情况?

    4个解决方案

    89 votes

    不同之处在于Boolean方法的显式类型会影响编译时表达式的静态类型:

    E1: `true ? returnsNull() : false` - boolean (auto-unboxing 2nd operand to boolean)

    E2: `true ? null : false` - Boolean (autoboxing of 3rd operand to Boolean)

    请参阅Java语言规范,第15.25节“条件运算符”?:

    对于E1,第2和第3个操作数的类型分别为Boolean和Boolean,因此本节适用于:

    如果第二个和第三个操作数之一是boolean类型,另一个类型是Boolean类型,那么条件表达式的类型是boolean。

    由于表达式的类型是Boolean,因此必须将第二个操作数强制转换为Boolean.编译器将自动取消装箱代码插入第二个操作数(返回值false),使其类型为E1.这当然会导致来自null的NPE 在运行时返回。

    对于E2,第2和第3个操作数的类型分别为Boolean(不是像E1中的Boolean)和false,因此不适用特定的输入条款(请阅读'em!),因此最终的“其他”条款适用:

    否则,第二和第三操作数分别是S1和S2类型。 设T1是将拳击转换应用于S1所产生的类型,让T2为应用到S2的装箱转换所产生的类型。 条件表达式的类型是将捕获转换(第5.1.10节)应用于lub(T1,T2)(第15.12.2.7节)的结果。

    S1 == Boolean(见§4.1)

    S2 == Boolean

    T1 == box(S1)== Boolean(参见§5.1.7中的拳击转换列表中的最后一项)

    T2 ==方框(S2)==`布尔值

    lub(T1,T2)== Boolean

    因此条件表达式的类型为Boolean,第3个操作数必须强制转换为Boolean.编译器为第3个操作数(false)插入自动装箱代码。 第二个操作数不需要E1中的自动拆箱,因此返回null时不会自动取消装箱NPE。

    这个问题需要类似的类型分析:

    Java条件运算符?:结果类型

    Bert F answered 2019-06-04T05:30:03Z

    22 votes

    这条线:

    Boolean b = true ? returnsNull() : false;

    内部转变为:

    Boolean b = true ? returnsNull().getBoolean() : false;

    执行拆箱; 因此:null.getBoolean()将产生NPE

    这是使用自动装箱时的主要缺陷之一。 这种行为确实记录在5.1.8 JLS中

    编辑:我认为拆箱是由于第三个运算符是布尔类型,如(隐式强制转换):

    Boolean b = (Boolean) true ? true : false;

    jjungnickel answered 2019-06-04T05:30:59Z

    16 votes

    从Java语言规范,第15.25节:

    如果是第二个和第三个之一   操作数的类型为boolean和   另一种类型是布尔型,   那么条件的类型   表达式是布尔值。

    因此,第一个示例尝试调用Boolean.booleanValue(),以便根据第一个规则将Boolean转换为boolean。

    在第二种情况下,第一个操作数是null类型,当第二个操作数不是引用类型时,应用自动装箱转换:

    否则,第二和第三   操作数是S1和S2类型   分别。 设T1是那种类型   应用拳击的结果   转换为S1,让T2成为   应用拳击造成的类型   转换为S2。 的类型   条件表达式就是结果   应用捕获转换   (§5.1.10)至lub(T1,T2)(§15.12.2.7)。

    axtavt answered 2019-06-04T05:31:59Z

    0 votes

    我们可以从字节代码中看到这个问题。 在main的字节码的第3行,3: invokevirtual #3 // Method java/lang/Boolean.booleanValue:()Z,值为null的装箱布尔值,invokevirtual方法java.lang.Boolean.booleanValue,它当然会抛出NPE。

    public static void main(java.lang.String[]) throws java.lang.Exception;

    descriptor: ([Ljava/lang/String;)V

    flags: ACC_PUBLIC, ACC_STATIC

    Code:

    stack=2, locals=2, args_size=1

    0: invokestatic #2 // Method returnsNull:()Ljava/lang/Boolean;

    3: invokevirtual #3 // Method java/lang/Boolean.booleanValue:()Z

    6: invokestatic #4 // Method java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean;

    9: astore_1

    10: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;

    13: aload_1

    14: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V

    17: return

    LineNumberTable:

    line 3: 0

    line 4: 10

    line 5: 17

    Exceptions:

    throws java.lang.Exception

    public static java.lang.Boolean returnsNull();

    descriptor: ()Ljava/lang/Boolean;

    flags: ACC_PUBLIC, ACC_STATIC

    Code:

    stack=1, locals=0, args_size=0

    0: aconst_null

    1: areturn

    LineNumberTable:

    line 8: 0

    Yanhui Zhou answered 2019-06-04T05:32:31Z

    展开全文
  • java 逻辑表达式 布尔 将布尔表达式转换为逻辑电路 (Converting Boolean Expression to Logic Circuit) The simplest way to convert a Boolean expression into a logical circuit is to follow the reverse ...

    java 逻辑表达式 布尔

    将布尔表达式转换为逻辑电路 (Converting Boolean Expression to Logic Circuit)

    The simplest way to convert a Boolean expression into a logical circuit is to follow the reverse approach in which we start from the output of the Boolean expression and reach towards the input.

    将布尔表达式转换为逻辑电路的最简单方法是遵循相反的方法,在这种方法中,我们从布尔表达式的输出开始,然后向输入过渡。

    Example1: Realize the Boolean Expression BC + A + (A + C) using AOI logic.

    示例1:使用AOI逻辑实现布尔表达式BC + A + (A + C) 。

    Solution:

    解:

    To realize this using the AOI logic gates, we will use the reverse approach.

    为了使用AOI逻辑门来实现这一点,我们将使用相反的方法。

    Step 1:

    第1步:

    Our expression BC + A + (A+C) is the summation of three terms BC, A and, (A+C), thus a 3-input OR Gate must have been used to obtain the expression as given :0

    我们的表达BC + A +(A + C)是三个方面BC,A和(A + C)的总和,从而一个3输入OR门必须被用于获得表达给出:0

    Realization of Boolean expressions using Basic Logic Gates (1)

    Step 2:

    第2步:

    Now, BC and (A + C) both are inverted in nature, so they must have been inverted using a NOT Gate earlier. BC must have been obtained by inverting the input BC and (A + C) must have been obtained by inverting the input (A + C) both using the NOT Gate.

    现在, BC和(A + C)本质上都是反向的,因此它们必须早先使用NOT门进行了反向。 BC必须已经通过反相输入BC获得,并且(A + C)必须已经通过使用NOT门将输入(A + C)反相获得。

    Realization of Boolean expressions using Basic Logic Gates (2)

    Step 3:

    第三步:

    Moving further, in the reverse direction we see, BC must have been an output of 2-input AND Gate with inputs as B and C. Likewise, (A + C) must have been obtained as the output of 2-input OR gate with A and C as the inputs.

    再往相反方向看,BC必须是输入为B和C的2输入与门的输出。同样,必须获得(A + C)作为2输入与门的输出,其中A和C作为输入。

    So, Final Logic Diagram for above given Boolean expression can be drawn as,

    因此,以上给出的布尔表达式的最终逻辑图可以绘制为:

    Realization of Boolean expressions using Basic Logic Gates (3)

    将逻辑图转换为布尔表达式 (Converting Logic Diagrams into Boolean Expressions)

    The easiest way to obtain the Boolean Expression from any logic circuit is to follow the forward propagation approach. In this, we start from the input side and move ahead until the output is reached. While moving from the input side to the output side, we continue evaluating the output of intermediate logic gates.

    从任何逻辑电路获得布尔表达式的最简单方法是遵循正向传播方法。 在这种情况下,我们从输入端开始,然后继续前进,直到达到输出为止。 从输入端移至输出端时,我们继续评估中间逻辑门的输出。

    Example 1: Find out the Boolean Expression for Logic Diagram given below and simplify the output in the minimal expression, also implement the simplified expression using the AOI logic.

    示例1:找出下面给出的逻辑图布尔表达式,并以最小表达式简化输出,还使用AOI逻辑实现简化表达式。

    Realization of Boolean expressions using Basic Logic Gates (4)

    Solution:

    解:

    Following the forward propagation approach, we see that gate G1 is a 2-input AND Gate having inputs A and B. So, output of G1 will be AB. Similarly, G2 is an OR Gate, so output of G2 will be (B+C). Also, G3 is an AND Gate and its output will be AB.

    按照前向传播方法,我们看到门G1是2输入与门,其输入A和B。因此,G1的输出将为AB。 同样,G2是“或”门,因此G2的输出为(B + C)。 同样,G3是与门,其输出将为AB。

    Now, gate G4 is a 2-input OR Gate which has one of its inputs as A and the other one is the output of gate G1, thus the output of gate G4 will be (A + AB). Similarly, output for gate G5 and G6 will be (B + BC) and (C + AB) respectively. Now, gate G7 is a 3-input AND Gate, therefore output (Y) of G7 will be equal to (A+AB). (B+BC). (C+AB)

    现在,门G4是2输入或门,其输入之一为A,另一个为门G1的输出,因此门G4的输出为(A + AB)。 同样,门G5和G6的输出分别为(B + BC)和(C + AB)。 现在,门G7是3输入与门,因此G7的输出(Y)等于(A + AB)。 (B + BC)。 (C + AB)

    Realization of Boolean expressions using Basic Logic Gates (5)

    Since, we have Y = (A+AB). (B+BC). (C+AB), now we have to minimize it.

    因为,我们有Y =(A + AB)。 (B + BC)。 (C + AB) ,现在我们必须将其最小化。

        Therefore, (A+AB). (B+BC). (C+AB)
        = A (1 + B). B (1 +C). (C+AB)
        = A. B. (C+AB)		[Since, 1+B =1 and 1+C =1]
        = AB (1 + C)
        = AB
    
    

    Therefore, Y=AB is the minimal expression. This can be implemented using a 2-input AND Gate having inputs A and B as:

    因此, Y = AB最小表达式 。 这可以使用具有输入A和B的2输入与门实现:

    Realization of Boolean expressions using Basic Logic Gates (6)

    翻译自: https://www.includehelp.com/basics/realization-of-boolean-expressions-using-basic-logic-gates.aspx

    java 逻辑表达式 布尔

    展开全文
  • Java if(布尔表达式)

    千次阅读 2013-09-04 14:32:45
    Java 的if (结果为布尔表达式)  if(1); 错误。 与c/c++ 的if(表达式) if(1);正确。

    Java 的if (结果为布尔的表达式)

     if(1); 错误。

    与c/c++ 的if(表达式)

    if(1);正确。

    展开全文
  • 翻译布尔表达式

    2019-11-18 21:19:31
    翻译布尔表达式 Time Limit: 1000 ms Memory Limit: 65536 KiB 注意以下java代码是一个能过样例,但是A不了的代码,我发出来,希望哪位大佬能帮我看看到底错在哪了,我测试了很多样例都能过,但是就是A不了, ...

    翻译布尔表达式

    Time Limit: 1000 ms Memory Limit: 65536 KiB

    注意以下java代码是一个能过样例,但是A不了的代码,我发出来,希望哪位大佬能帮我看看到底错在哪了,我测试了很多样例都能过,但是就是A不了,

    Problem Description

    大家都学过了布尔表达式的翻译,其中有一个拉链-回填技术,这次我们就练习这个技术。

    Input

    多组输入,首先输入一个整数T,代表数据组数。

    接下来每组输入为一行字符串,例如: a < b or c < d and e < f

    每个符号都用空格间隔。

    Output

    假链跳到0,真链跳到1,表达式序号从100开始排。

    Sample Input

    1
    a < b or c < d and e < f

    Sample Output

    100(j<,a,b,1)
    101(j,,,102)
    102(j<,c,d,104)
    103(j,,,0)
    104(j<,e,f,100)
    105(j,,,103)
    我的主要是思想是,根据or和and的优先级不同,我将代码先通过"or"分离,存在一个字符串数组中,然后每个数组元素是一个表达式或者是含and的表达式,
    只需要将and表达式单独拿出来讨论即可,我将每个四元式要跳转的地方存在sum数组数组中,因为每一个表达式有两个跳转(op,a,b, )和(j,,, )。最后输出时只需要将每个四元式与其相应sum数组中的跳转地方,链接成字符串输出即可

    package java13;
    
    import java.util.HashSet;
    import java.util.Scanner;
    import java.util.Set;
    
    public class Main {
    	public static void main(String args[]) {
    		Scanner scan = new Scanner(System.in);
    		int n = scan.nextInt();
    		scan.nextLine();
    		for (int i = 0; i < n; i++) {
    			String boolstr = scan.nextLine();
    			String andstr[] = boolstr.split("or");// 按照or分
    			int[] sum = new int[100];// 用来标记每个四元式后面的跳转地
    			int jp = 0, k = 100;// jp为sum数组下标
    			for (int j = 0; j < andstr.length; j++)//
    			{
    				if (andstr[j].contains("and"))// 判断是否含有and,含有则需要单独拿出来
    				{
    					String orstr[] = andstr[j].trim().split("and");
    					for (int l = 0; l < orstr.length; l++) {
    						if (l != orstr.length - 1)// 含or的表达式中的最后一个布尔
    						{
    							sum[jp++] = k + 2;
    							if (j != andstr.length - 1)// 该含and表达式不是最后一个
    								sum[jp++] = (orstr.length - l) * 2 + k;
    							else
    								sum[jp++] = 0;
    							k = k + 2;
    						} else {
    							sum[jp++] = 1;
    							if (j != andstr.length - 1)// 该含and表达式不是最后一个
    								sum[jp++] = (orstr.length - l) * 2 + k;
    							else
    								sum[jp++] = 0;
    							k = k + 2;
    						}
    					}
    				} else {
    					sum[jp++] = 1;
    					if (j != andstr.length - 1)
    						sum[jp++] = k + 2;
    					else
    						sum[jp++] = 0;
    					k = k + 2;
    				}
    			}
    			String splitstr[] = boolstr.split(" ");
    			int jump = 0;
    			String[] jumpstr = new String[100];
    			int num = 100;
    			int j = 3;
    			for (; j < splitstr.length; j = j + 4) {
    				jumpstr[jump++] = num + "(j" + splitstr[j - 2] + ","
    						+ splitstr[j - 3] + "," + splitstr[j - 1] + ",";
    				num++;
    				jumpstr[jump++] = num + "(j" + ",_,_,";
    				num++;
    
    			}
    			jumpstr[jump++] = num + "(j" + splitstr[j - 2] + ","
    					+ splitstr[j - 3] + "," + splitstr[j - 1] + ",";
    			num++;
    			jumpstr[jump++] = num + "(j" + ",_,_,";
    			String str1 = null;
    			String str2 = null;
    			for (j = 0; j < jump; j++) {
    				if (sum[j] == 0) {
    					str1 = jumpstr[j].substring(0, 3);
    					break;
    				}
    			}
    			for (j = 0; j < jump; j++) {
    				if (sum[j] == 1) {
    					str2 = jumpstr[j].substring(0, 3);
    					break;
    				}
    			}
    			Set<Integer> set = new HashSet<Integer>();
    			set.clear();
    			for (j = 0; j < jump; j++) {
    				if (sum[j] == 0) {
    					if (!set.contains(0)) {
    						System.out.println(jumpstr[j] + sum[j] + ")");
    						set.add(0);
    					} else {
    						System.out.println(jumpstr[j] + str1 + ")");
    					}
    				} else if (sum[j] == 1) {
    					if (!set.contains(1)) {
    						System.out.println(jumpstr[j] + sum[j] + ")");
    						set.add(1);
    					} else {
    						System.out.println(jumpstr[j] + str2 + ")");
    					}
    				} else {
    					System.out.println(jumpstr[j] + sum[j] + ")");
    				}
    			}
    
    		}
    		scan.close();
    	}
    
    }
    
    展开全文
  • 给你一个以字符串形式表述的布尔表达式(boolean) expression,返回该式的运算结果。 有效的表达式需遵循以下约定: "t",运算结果为 True "f",运算结果为 False "!(expr)",运算过程为对内部表达式 expr 进行...
  • 一.IO流 1.io流概述 二.字节输出流(FileOutputStream类) 1.一切皆为字节 一切文件数据在存储时,都是以二进制...(1)java.io.OutputStream:字节输出流概述 此抽象类是表示输出字节流的所有类的超类。 定义了一...
  • 03.MVEL基本语法-布尔表达式

    千次阅读 2015-06-15 21:14:30
    MVEL的布尔表达式JAVA一样有优先级,包括通过括号来控制执行顺序。 MVEL布尔表达式的操作符如下: 操作符 说明 示例 == 比较两个值是否相等 与java的字符串内存地址比较不一样 ‘foo’=='...
  • 实验要求: 1、[实验项目] 完成以下描述赋值语句的LL(1)文法的递归下降分析程序 G[S]: S→V=E ...(1)输入串应是词法分析的输出二元式序列,即某算术表达式“专题1”的输出结果,输出为输...
  • java三元表达式

    2019-12-16 12:32:53
    布尔表达式?a:b布尔表达式为true结果为a,表达式为false结果为b java三元表达式有字符强转的功能,会把后面的强转为和前面的类型一样如果前面是int型 会把后面字符变成对应的ascii码。如果前面是char型 会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,766
精华内容 1,106
关键字:

java布尔表达式

java 订阅