Java 为什么我必须初始化;j";?

Java 为什么我必须初始化;j";?,java,initialization,nested-loops,Java,Initialization,Nested Loops,下面是来自的示例代码 LabelDemo类中断{ 公共静态void main(字符串[]args){ int[][]数组查找={ { 32, 87, 3, 589 }, { 12, 1076, 2000, 8 }, { 622, 127, 77, 955 } }; int searchfor=12; int i; int j=0; 布尔foundIt=false; 搜索: 对于(i=0;i

下面是来自的示例代码

LabelDemo类中断{
公共静态void main(字符串[]args){
int[][]数组查找={
{ 32, 87, 3, 589 },
{ 12, 1076, 2000, 8 },
{ 622, 127, 77, 955 }
};
int searchfor=12;
int i;
int j=0;
布尔foundIt=false;
搜索:
对于(i=0;i
我的问题是:为什么我必须在嵌套for循环执行之前初始化变量j?当我不这样做时,代码会被编译成一个错误


提前感谢。

因为您使用的是for循环之外的
j


特别是,您在代码底部的print语句中使用了它。

因为您在for循环之外使用了
j


特别是,您在代码底部的print语句中使用了它。

您必须初始化
j
,因为编译器不知道在最后的
if
语句中访问它之前,它是否会在
for
内部循环中初始化


就编译器而言,外部
for
循环的主体可能不会被执行。

您必须初始化
j
,因为编译器不知道在最后的
if
语句中访问它之前,它是否会在内部
for
循环中被初始化


就编译器而言,
循环的外部
主体可能不会执行。

如果
arrayFints.length
为0,则不会初始化
j
。为了让编译器确定总是初始化
j
,需要将第一个循环的条件设置为常量表达式。例如,如果将外部回路替换为:

for (i = 0; true; i++)
编译器将接受
intj无需初始化


详细规则在中定义。特别是,
j
在打印语句中使用之前需要明确赋值。

如果
arrayFints.length
为0,
j
将不会被初始化。为了让编译器确定总是初始化
j
,需要将第一个循环的条件设置为常量表达式。例如,如果将外部回路替换为:

for (i = 0; true; i++)
编译器将接受
intj无需初始化


详细规则在中定义。特别是,
j
在用于打印语句之前需要明确赋值。

理论上,编译器可以知道
arrayFints.length
的值,并确定将命中
for
内部循环的初始值设定项(信息就在那里)。实际上,它并没有那么聪明,这是绝对正确的。让我困惑的是,对变量i的需求不同。然而,我刚刚意识到,由于变量I在第一个循环中使用,它肯定会被初始化。谢谢。对-具体来说,我是在第一个循环的初始化中初始化的,如果达到for语句,保证会尝试初始化。理论上,编译器可以知道
ArrayFints.length
的值,并确定将命中
for
内部循环的初始值设定项(信息在那里). 实际上,它并没有那么聪明,这是绝对正确的。让我困惑的是,对变量i的需求不同。然而,我刚刚意识到,由于变量I在第一个循环中使用,它肯定会被初始化。谢谢。对-具体地说,我是在第一个循环的初始化中初始化的,如果达到for语句,保证会尝试第一个循环。