小谈Java的初始化问题

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);
		}
	}
}


上面的代码并没有报错。可见就算for循环不符合数理,仍然是可以通过编译的。

那么从安全的角度看来,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);
	}
}


则无法通过编译。以上两则代码的区别仅仅是在于判断条件所在的位置。在while(true)中,这个循环是绝对可以进入的,但是在while(i)中呢?假设存在多线程的情况,那么这个循环将不一定可以进入。

所以多少可以侧证我们之前的结论:Java为了注重安全性,不会允许初始化的工作放在不确定的循环中。

---------------------------切割线-----------------------------

那Java不是会自动初始化的嘛?

思考以下代码:


package hello;
public class hello {
	private static int age;
	public static void main(String[] args) {
		System.out.println(age);
	}
}


在代码中,age必须是static的,因为调用它的方法(main)是static的,这是题外话了。

上面的代码输出结果是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是不会初始化的。

本文结束。


小谈Java的初始化问题

上一篇:Linux Shell脚本编写


下一篇:CareerCup Find the biggest interval that has all its members in list in O(n)