对总noob问题抱歉,但是有人可以解释在for-each循环完成后,match
的值在以下方法中发生了什么吗?
尝试编译会产生警告:variable match might not have been initialised
。
public void listMatching(String searchString) {
boolean match;
for(String filename : files) {
if(filename.contains(searchString)) {
System.out.println(filename);
match = true;
}
else {
match = false;
}
}
if(match == false) {
System.out.println("No matches found for " + searchString);
}
}
答案 0 :(得分:3)
首先,您需要定义boolean match = false;
此外,一旦找到匹配项,您需要从循环中断,其他match
状态将被覆盖。
if(filename.contains(searchString)) {
System.out.println(filename);
match = true;
break;
} // this wil help whether a match is found or not
如果您有兴趣查找匹配数量 int counter = 0; if(filename.contains(searchString)){ 的System.out.println(文件名); match = true; 计数器++; } //这将有助于找到匹配数
最后System.out.println("number of matches for"+searchString+" : "+counter);
答案 1 :(得分:2)
这是一个可以按照您的要求执行的修复:
public void listMatching(String searchString) {
boolean match = false; // initialize local variable
for(String filename : files) {
if(filename.contains(searchString)) {
System.out.println(filename);
match = true;
}
}
if(!match) { // same as 'match == false', just without comparison
System.out.println("No matches found for " + searchString);
}
}
必须初始化局部变量。只有字段才能获得其类型的默认值。
如果您在match
块中将false
重新分配给else
,则在循环后它将为false
,即使每个filename
包含{{1}除了最后一个。
答案 2 :(得分:0)
您需要在找到匹配项时打破循环。
你需要初始化你找到的变量,你也可能永远不会运行你的循环,然后你的if条件会看一个非初始化的变量,这就是你的编译器想要告诉你的东西
答案 3 :(得分:0)
将变量初始化为false以避免程序中出现警告。
此外,match
是单个变量,并且根据各种文件的内容(搜索相同的字符串),您将为同一个变量分配true或false。
match
的最终布尔值只是在文件列表的最后一个文件中搜索字符串的结果。
答案 4 :(得分:0)
可能文件数组为空,因此您应该为匹配变量设置默认值;
boolean match=false;
for(String filename : files) {
if(filename.contains(searchString)) {
System.out.println(filename);
match = true;
break;
}
}
如果您需要检查所有文件是否都有此搜索字符串,则可以使用此代码:
boolean match=files.lenght!=0;
for(String filename : files) {
if(!filename.contains(searchString)) {
System.out.println(filename);
match = false;
break;
}
}