首页 > 其他 > 详细

小谈Java的初始化问题

时间:2014-01-21 09:30:46      阅读:292      评论:0      收藏:0      [点我收藏+]

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的初始化问题

原文:http://blog.csdn.net/xiaorang_java/article/details/18265037

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!