当前位置: 首页 > 面试题库 >

为什么尝试打印未初始化的变量并不总是导致错误消息

商佑运
2023-03-14
问题内容

当我尝试在实例初始值设定项块内直接打印x,而在块末尾之前为x赋值时,就会出现问题:

情况1

class HelloWorld {

    final int x;

    {
        System.out.println(x);
        x = 7;
        System.out.println(x);    
    }

    HelloWorld() {
        System.out.println("hi");
    }

    public static void main(String[] args) {
        HelloWorld t = new HelloWorld();
    }
}

这给出了编译时错误,指出变量x可能尚未初始化。

$ javac HelloWorld.java
HelloWorld.java:6: error: variable x might not have been initialized
        System.out.println(x);
                           ^
1 error

情况二

我不是直接打印,而是调用一个函数来打印:

class HelloWorld {

    final int x;

    {
        printX();
        x = 7;
        printX();
    }

    HelloWorld() {
        System.out.println("hi");
    }

    void printX() {
        System.out.println(x);
    }

    public static void main(String[] args) {
        HelloWorld t = new HelloWorld();
    }
}

这样可以正确编译并提供输出

0
7
hi

两种情况在概念上有什么区别?


问题答案:

在JLS中,第8.3.3节。字段初始化期间的正向引用,它指出在以下情况下存在编译时错误:

有时会限制使用声明之后以文本形式出现的实例变量,即使这些实例变量在范围内。具体来说,如果满足以下所有条件,则是编译时错误:

  • 类或接口C中实例变量的声明在使用实例变量后以文本形式出现;

  • 在C的实例变量初始化器或C的实例初始化器中,此用法是一个简单的名称;

  • 用法不在作业的左侧;

  • C是封闭使用的最里面的类或接口。

以下规则附带一些示例,其中最接近您的示例是:

class Z {
    static int peek() { return j; }
    static int i = peek();
    static int j = 1;
}
class Test {
    public static void main(String[] args) {
        System.out.println(Z.i);
    }
}

访问[静态或实例变量]通过 方法以这种方式,不检查
,那么上面的代码产生输出0,因为变量初始值设定为i使用类方法peek()访问的变量的值j之前j已被其变量初始值初始化时,在它仍然具有其默认值(第4.12.5节,变量的初始值)。

因此,总而言之,您的第二个示例可以编译并执行得很好,因为x在您调用时printX()以及printX()实际发生在运行时时,编译器不会检查该变量是否已经初始化,因此x将为其分配默认值(0)。



 类似资料:
  • 问题内容: 当我尝试在实例初始值设定项块内直接打印x,而在块末尾之前为x赋值时,就会出现问题: 情况1 这给出了编译时错误,指出变量x可能尚未初始化。 情况二 我不是直接打印,而是调用一个函数来打印: 这样可以正确编译并提供输出 两种情况在概念上有什么区别? 问题答案: 在JLS中,第8.3.3节。字段初始化期间的正向引用,它指出在以下情况下存在编译时错误: 有时会限制使用声明之后以文本形式出现的

  • *编辑:好的,在修复了try catch错误后,我在< code>catch {..打印时。*,基本上,当我说我想再玩一次时,它会继续游戏,但它也会打印第一个< code>catch,然后在第23行要求输入。 嗨,这是我的第一篇文章,所以如果我在论坛上的代码格式错误,我会编辑它。 现在我正在用java eclipse编写一个游戏,其中cpu生成一个数字,用户必须猜测它。我大部分时间都在使用扫描仪类

  • 问题内容: 我的Java程序中出现以下错误: Java变量未初始化错误…错误:变量nam和r未初始化位置类子级 但是并且已经初始化,但是我仍然遇到相同的错误。 问题答案: 不要获取 默认值 ,应在使用它们之前对其进行初始化,并使用main中的默认值进行初始化,这样就可以了。 顺便说一句,考虑为您的类和变量命名是有意义的。

  • 为什么未初始化的变量打印一个奇怪的负值?

  • 我有以下Java代码: 但是,当我运行它时,它会抛出以下错误: 我在do之前初始化了变量。while 循环,并在 try. 中设置值。捕获循环。似乎尚未设置该变量。抱歉,如果这是一个相当基本的问题,但我似乎无法弄清楚。

  • 我正在尝试设置DBMS\U元数据的输出。将\u DDL获取到SQLPlus中的myRET\u VARbind变量。 我尝试了以下脚本。sql: 但我得到: SP2-1504:无法打印未初始化的LOB变量“RET\u VAL” 我还尝试用一个/块来围绕RET\u VAL的赋值: 但是,当我尝试在SQLPlus中运行它时,会出现以下错误: 第5行的错误:ORA-06550:第5行,第1列:PLS-00