这有两个简单代码,代码(一)显示两个错误找不到符号,但是我把代码改成(二)之后就能正常运行了,请帮我解释一下为什么???
(一)import java.util.*;
class Bo
{ public static void main(String agrs[])
{ int i,x,n;
for(x=0;x<2;x++)
{ if(x==0)
{ String s[]=new String[4];
for(i=0,n=1;i<4;i++)
{ s[i]=String.valueOf(n);n++;
}
}
else
{ String s[]=new String[4];
for(i=0,n=5;i<4;i++)
{ s[i]=String.valueOf(n);n++;
}
}
for(i=0;i<s.length;i++)
System.out.println(s[i]);
} }
}
-------------------
(二)import java.util.*;
class Bo
{ public static void main(String agrs[])
{ int i,x,n;
for(x=0;x<2;x++)
{ if(x==0)
{ String s[]=new String[4];
for(i=0,n=1;i<4;i++)
{ s[i]=String.valueOf(n);n++;
}
for(i=0;i<s.length;i++)
System.out.println(s[i]);
}
else
{ String s[]=new String[4];
for(i=0,n=5;i<4;i++)
{ s[i]=String.valueOf(n);n++;
}
for(i=0;i<s.length;i++)
System.out.println(s[i]);
}
} }
}
(一)import java.util.*;
class Bo
{ public static void main(String agrs[])
{ int i,x,n;
for(x=0;x<2;x++)
{ if(x==0)
{ String s[]=new String[4];
for(i=0,n=1;i<4;i++)
{ s[i]=String.valueOf(n);n++;
}
}
else
{ String s[]=new String[4];
for(i=0,n=5;i<4;i++)
{ s[i]=String.valueOf(n);n++;
}
}
for(i=0;i<s.length;i++)
System.out.println(s[i]);
} }
}
-------------------
(二)import java.util.*;
class Bo
{ public static void main(String agrs[])
{ int i,x,n;
for(x=0;x<2;x++)
{ if(x==0)
{ String s[]=new String[4];
for(i=0,n=1;i<4;i++)
{ s[i]=String.valueOf(n);n++;
}
for(i=0;i<s.length;i++)
System.out.println(s[i]);
}
else
{ String s[]=new String[4];
for(i=0,n=5;i<4;i++)
{ s[i]=String.valueOf(n);n++;
}
for(i=0;i<s.length;i++)
System.out.println(s[i]);
}
} }
}
System.out.println(s[i]);原因:
S变量没有定义,你在14行定义的S变量是一个局部变量
你的代码二里,是将上面两行的代码放到和S变量一个块里,所以不报错,如果想代码一不报错,就将S变量提出来。
看下这个关于UDP的发送图片的问题
class Bo
{
public static void main(String agrs[])
{
int i,x,n;
for(x=0;x<2;x++) //x的取值范围
{
if(x==0) //x=0的情况
{
String s[]=new String[4]; //初始化数组
for(i=0,n=1;i<4;i++) //遍历这个数组
{
s[i]=String.valueOf(n);n++;
}
//for(i=0;i<s.length;i++) //这儿就是在程序1正确的前提下,在这儿再加上一个输出
// System.out.println(s[i]); // 输出的是 1,2,3,4
}
else
{
String s[]=new String[4];
for(i=0,n=5;i<4;i++)
{
s[i]=String.valueOf(n);n++;
}
for(i=0;i<s.length;i++)
System.out.println(s[i]);
} }
}
}
这样改后输出的结果是 5 6 7 8 ,主要是{}的问题;
if 与else 是一个整体的结构,
在 for(x=0;x<2;x++)控制下:
if 的结构是这样的:
if(x==0) //x=0的情况
{
String s[]=new String[4]; //初始化数组
for(i=0,n=1;i<4;i++) //遍历这个数组
{
s[i]=String.valueOf(n);n++;
}
}else 内部也应该由两个配套的两个{}控制的:
else
{
String s[]=new String[4];
for(i=0,n=5;i<4;i++)
{
s[i]=String.valueOf(n);n++;
}
for(i=0;i<s.length;i++)
System.out.println(s[i]);
}所以第一个程序的错误就是大括弧的问题;
System.out.println(s[i]);
这里的时候,编译通不过,是因为编译器根本不认识s这个变量,也就是说在用到S之前,你没有创建它,你创建的那个s的作用域只有if (x == 0) {
String s[] = new String[4];
for (i = 0, n = 1; i < 4; i++) {
s[i] = String.valueOf(n);
n++;
}
}这个大括号里面能用,所以到for循环哪里,s的生命周期已经结束了,而你的第二份中,s的生命周期
String s[] = new String[4];
for (i = 0, n = 5; i < 4; i++) {
s[i] = String.valueOf(n);
n++;
}
for (i = 0; i < s.length; i++)
System.out.println(s[i]);
是这些,在你for循环体重用到的时候,s已经定义过了,且在它的生命周期内,所以在编译期不会报错