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