为什么下面的代码可以正常工作?
String str;
while (condition) {
str = calculateStr();
.....
}
但是这个被认为是危险/不正确的:
while (condition) {
String str = calculateStr();
.....
}
在循环外声明变量是必要的吗?
为什么下面的代码可以正常工作?
String str;
while (condition) {
str = calculateStr();
.....
}
但是这个被认为是危险/不正确的:
while (condition) {
String str = calculateStr();
.....
}
在循环外声明变量是必要的吗?
String str;
while(condition){
str = calculateStr();
.....
}
这并不比这个更好:
while(condition){
String str = calculateStr();
.....
}
在循环内部声明会限制相应变量的作用域。这完全取决于项目对变量作用域的需求。
确实,上述问题是一个编程问题。您想如何编写代码?您需要在哪里访问“STR”?声明仅在本地使用的变量作为全局变量是没有用处的。我认为这是编程的基础。
这两个例子得到的结果是相同的。然而,第一个让你可以在 while 循环之外使用 str
变量;而第二个则不行。
我认为对象的大小也很重要。 在我的一个项目中,我们声明并初始化了一个大型的二维数组,导致应用程序抛出了内存不足异常。 我们将声明移到了循环外,并在每次迭代开始时清空了数组。
即使在执行下面的代码后,str
变量仍将可用并保留一些内存空间。
String str;
while(condition){
str = calculateStr();
.....
}
在下面的代码中,str
变量将不可用,并且为str
变量分配的内存也将被释放。
while(condition){
String str = calculateStr();
.....
}
如果我们遵循第二种方法,肯定会减少系统内存并提高性能。
public class Test
{
private final static int STUFF_SIZE = 512;
private final static long LOOP = 10000000l;
private static class Foo
{
private long[] bigStuff = new long[STUFF_SIZE];
public Foo(long value)
{
setValue(value);
}
public void setValue(long value)
{
// Putting value in a random place.
bigStuff[(int) (value % STUFF_SIZE)] = value;
}
public long getValue()
{
// Retrieving whatever value.
return bigStuff[STUFF_SIZE / 2];
}
}
public static long test1()
{
long total = 0;
for (long i = 0; i < LOOP; i++)
{
Foo foo = new Foo(i);
total += foo.getValue();
}
return total;
}
public static long test2()
{
long total = 0;
Foo foo = new Foo(0);
for (long i = 0; i < LOOP; i++)
{
foo.setValue(i);
total += foo.getValue();
}
return total;
}
public static void main(String[] args)
{
long start;
start = System.currentTimeMillis();
test1();
System.out.println(System.currentTimeMillis() - start);
start = System.currentTimeMillis();
test2();
System.out.println(System.currentTimeMillis() - start);
}
}
bigStuff[(int) (value % STUFF_SIZE)] = value;
(尝试一个值为2147483649L的例子) - Hardcoded如果你的calculateStr()
方法返回null,然后你试图在str上调用一个方法,那么你就有了NullPointerException
的风险。
更一般地说,避免使用值为null的变量。顺便说一下,对于类属性来说,这更加重要。
NullPointerException
的风险。如果这段代码尝试执行return str;
,它将会遇到编译错误。 - user207421