CSDN乱码了。重新编辑。
同学发给我一个代码如下:
package hello;
public class hello {
public static void main(String[] args) {
int i, j;
int sum;
for (i = 1; i <= 1000; i++) {
for (j = 1, sum = 0; j <= i / 2; j++) {
if (i % j == 0)
sum += j;
}
if (sum == i)
System.out.println(sum);
}
}
}
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The local variable sum may not have been initialized
The local variable sum may not have been initialized
at hello.hello.main(hello.java:12)
通过对sum的追踪发现sum与int sum中的sum是一个变量。通过C++测试发现C++编译通过并得到结果。
修改代码如下:
package hello;
public class hello {
public static void main(String[] args) {
int i, j;
int sum = 0;//*修改
for (i = 1; i <= 1000; i++) {
for (j = 1, sum = 0; j <= i / 2; j++) {
if (i % j == 0)
sum += j;
}
if (sum == i)
System.out.println(sum);
}
}
}
思考如下:Java是一门比较注重安全的语言,for循环能否保证一定可以进入呢?
思考以下代码:
package hello;
public class hello {
public static void main(String[] args) {
int i, j;
int sum = 0;
for (i = 1; i <= -1000; i++) {
for (j = 1, sum = 0; j <= i / 2; j++) {
if (i % j == 0)
sum += j;
}
if (sum == i)
System.out.println(sum);
}
}
}
那么从安全的角度看来,Java就不应该让一个全局变量的初始化发生在for循环中。当然这是我们的猜测而已。
再思考以下代码:
package hello;
public class hello {
public static void main(String[] args) {
int sum;
while(true){
sum = 1000;
break;
}
System.out.println(sum);
}
}
而:
package hello;
public class hello {
public static void main(String[] args) {
int sum;
boolean i = true;
while(i){
sum = 1000;
break;
}
System.out.println(sum);
}
}
所以多少可以侧证我们之前的结论:Java为了注重安全性,不会允许初始化的工作放在不确定的循环中。
---------------------------切割线-----------------------------
那Java不是会自动初始化的嘛?
思考以下代码:
package hello;
public class hello {
private static int age;
public static void main(String[] args) {
System.out.println(age);
}
}
上面的代码输出结果是0,表示Java会自动初始化这个成员变量。
那么局部变量呢?
package hello;
public class hello {
// private static int age;
public static void main(String[] args) {
int age;
System.out.println(age);
}
}
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The local variable age may not have been initialized
at hello.hello.main(hello.java:6)
所以局部变量Java是不会初始化的。
本文结束。