java - 局部变量初始化

标签 java

为什么编译器很高兴变量 gif(true) 语句中初始化,而在 if(gg) 情况下提示 g 初始化,并抛出以下错误:

错误:(11, 28) java:变量 g 可能尚未初始化

  public static void main(String args[]) {
    boolean gg = true;
    int g;
    if (gg)
    //  if (true)
    {
        g = 6;
    }
    System.out.println(g);
}

最佳答案

true是一个常量表达式,编译器可以在编译时扣除它的值。

另一方面,gg 不是常量,而是一个变量,您可以使用任何内容(甚至是表达式、函数的返回值等)对其进行初始化。因此,编译器不会检查您如何初始化该变量,而是假设它可以是任何东西。

这就是为什么编译器认为变量g可以或不能初始化。

您认为编译器可以深入多深?以这个为例:

boolean gg = Math.random() >= 0.5;
gg = gg ? gg : true;

我们知道gg为真,但是编译器如何知道它呢?

或者另一个例子:

boolean gg = (Math.random() >= 0.0);

同样,我们知道它始终为真(因为 random() 介于 0.01.0 之间),但编译器不知道。

因此,这对于编译器来说并不是一件容易的事,因此编译器创建者决定在预测执行流程时仅检查常量表达式,而不是猜测变量值。

这就是为什么您在一种情况下收到警告而在另一种情况下则没有的原因。

关于java - 局部变量初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58303604/

相关文章:

java - 如何在 ANTLR 中处理左联想语法

java - 参数 @x 没有为存储过程定义...使用 MS_SQL JDBC

java - 编写一个在 Map 中添加 String 集合的方法

java - 在 java spring boot 中,图像没有从 excel 插入数据库?

javascript - 在 JSObject、AbstractJSObject 中重写 hasMember() 有什么用?

java - 键入按钮时 JButton 不会改变颜色

java - 在java中生成随机数并找出小于或等于50的百分比

java - 从 Arduino 读取串行数据

java - 使用反射的 javax.servlet.http.Cookie 的 NoSuchMethodException

Java - 为什么 readAllBytes 返回错误的字节码?