Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有条件时是否可以在Java中声明变量?_Java_While Loop - Fatal编程技术网

有条件时是否可以在Java中声明变量?

有条件时是否可以在Java中声明变量?,java,while-loop,Java,While Loop,在Java中,可以在for循环的初始化部分声明变量: for ( int i=0; i < 10; i++) { // do something (with i) } 在stackoverflow上,我发现至少可以防止获取可处理项的重复代码: List<Object> processables; while ((processables = retrieveProcessableItems(..)).size() > 0) { // process item

在Java中,可以在
for
循环的初始化部分声明变量:

for ( int i=0; i < 10; i++) {
  // do something (with i)
}
在stackoverflow上,我发现至少可以防止获取可处理项的重复代码:

List<Object> processables;
while ((processables = retrieveProcessableItems(..)).size() > 0) {
    // process items
}
列出可处理内容;
while((processables=retrieveProcessableItems(..).size()>0){
//处理项目
}
但是变量仍然必须在while循环之外声明

因此,为了保持变量范围干净,是否可以在while条件中声明变量,或者是否有其他解决方案用于此类情况?

不可能

它也没有太大的意义:不像
for
循环可以设置“循环变量”的初始状态,在
循环中测试现有变量的值,类似于
for
循环的条件检查

当然,如果您担心变量“泄漏”到代码的其他部分,您可以将整个过程包含在一个额外的作用域块中:

{
   /*declare variable here*/
   while(...){...}
}

或者,将
while
循环转换为
for
循环。

您可以使用
for
循环编写
while
循环:

while (condition) { ... }
for (List<Object> processables;
     (processables = retrieveProcessableItems(..)).size() > 0;) {
  // ... Process items.
}

for (; condition; ) { ... }
由于括号中的所有三位都是可选的:

BasicForStatement:
    for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement
类似地,您可以将
while
循环重写为
for
循环:

while (condition) { ... }
for (List<Object> processables;
     (processables = retrieveProcessableItems(..)).size() > 0;) {
  // ... Process items.
}
用于(列出可处理内容;
(processables=retrieveProcessableItems(..).size()>0;){
//…处理项目。
}

请注意,一些静态分析工具(例如eclipse 4.5)可能要求将初始值分配给
processables
,例如
List processables=null
。根据JLS,这是不正确的;我的
javac
版本不会抱怨变量最初没有赋值。

破坏了你的上一个想法。抱歉,for循环重新引入了重复代码问题,因为必须更新语句增量部分中的
processables
:for(List processables=retrieveProcessableItems(..);processables.size()>0;processables=retrieveProcessableItems(..)
@Bathsheba对不起,我不是故意说我不相信你:)就像我说的,我从来没有理由在[ForInit]中声明一个没有初始化的变量。试过了,检查了规格;当然,你是对的。对我来说,这是IDE的一个缺陷:它应该知道在读取变量的内容之前,总是给变量赋值
=null
然后就是了。@Bathsheba我把它作为一个单独的点移了出来,所以更容易阅读“无误”的答案。谢谢。在这种情况下,有一个
do-while
循环听起来是个不错的选择。声明必须留在循环之外,但至少您只有一个赋值,而不是两个。@JaroslawPawlak-那么,与我的最后一个
,而上面的
示例的区别在哪里?更干净的代码。它不会在布尔表达式中隐藏赋值。@JaroslawPawlak您能用一个例子给出答案吗?现在我无法想象你的意思。我认为这比公认的答案更好更干净。可读性强得多。@rpax虽然可能更简洁,但我只是将其视为解决问题的一种方法。我当然知道我可以用大括号人为地限制变量的范围,但这不是我想要的。另一个答案更多地集中在使用
for
的替代解决方案上,它实际上可以替代
while
循环。