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语句,保证会尝试第一个循环。