所以,这是我正在处理的代码片段:
String direction = s.readLine();
System.out.println(direction);
if (direction.equals("up") != true && direction.equals("down") != true &&
direction.equals("left") != true && direction.equals("right") &&
direction.equals(null) != true) {
System.out.println("Invalid Solution file");
System.exit(0);
}
它应该做的是从文本文件中读取一行(使用BufferedReader
)然后如果该行不是有效方向或空白则应该打印"无效的解决方案"并退出。
问题是无论方向字符串是什么,if语句仍然运行。我输入了一个println来检查方向是否正确读取但看起来绝对没问题。那么为什么代码不按预期工作呢?
答案 0 :(得分:5)
您的部分问题是可读性。解决这个问题,你的问题解决了90%:
private static List<String> DIRECTIONS = Arrays.asList("up", "down", "left", "right");
然后
if (!DIRECTIONS.contains(direction)) {
System.out.println("Invalid Solution file");
System.exit(0);
}
另外10%是如何检查null,direction == null
,但如果您使用此代码则不需要,因为contains(null)
将方便地返回false
。
答案 1 :(得分:1)
这里&& direction.equals("right")
我认为你犯了一个错误,因为它与其他人存在矛盾:
direction.equals("up") != true &&
direction.equals("down") != true &&
direction.equals("left") != true
你在大多数条件下测试否定,但direction.equals("right")
测试肯定。
尝试它,它是相同的,但更简洁,更可读:
if (direction !=null && !direction.equals("up") &&
!direction.equals("down") &&
!direction.equals("left") &&
!direction.equals("right") ){
System.out.println("Invalid Solution file");
System.exit(0);
}
答案 2 :(得分:1)
你的代码比它需要的要复杂得多。
请考虑一下:
Set<String> validDirections = new HashSet<>(Arrays.asList("up", "down", ...
if (validDirections.contain(direction.toLowerCase()) {
// good ...
} else {
// bad ..
}
例如,您可以将validDirections
设为全局常量;所以它也可以在其他地方使用。
我在这里要解释的是:您的代码是低级。低级代码很难编写,读取,维护和扩展。编程始终是关于创建良好的抽象。反之亦然:如果你不使用抽象,你最终会得到非常抽象的代码,就像你在这里展示的代码一样!
例如:如果你需要另一个方向,那么你必须把你的方法放得太复杂了。在我的解决方案中,您只需将其放入构建该Set的语句中。
最后:你的错误信息,什么也没说。所以,那个字符串很糟糕;但为什么呢?至少打印导致错误的字符串会不会更好?!
答案 3 :(得分:0)
首先,你不应该将!= true
与布尔语句一起使用,这是不好的形式。像这样改写:
direction !=null &&
!direction.equals("up") &&
!direction.equals("down") &&
!direction.equals("left") &&
!direction.equals("right")
您的错误是您没有将!= true
部分包含在化合物中的某个语句中。替换为上面的代码来解决问题。
答案 4 :(得分:0)
我很困惑为什么你在使用!=当你的.equals方法已经返回一个布尔值时为真。试试这个。
String direction = s.readLine();
System.out.println(direction);
if ( direction!=null && !direction.equals("up") && !direction.equals("down")&& !direction.equals("left")&& direction.equals("right")){
System.out.println("Invalid Solution file");
System.exit(0);
}
答案 5 :(得分:0)
quals方法返回一个布尔值,因此不需要将结果与true或false值进行比较。此外,我将从null比较开始 - 缩短了Java中的布尔表达式,因此如果将完成此部分,则不评估表达式的其余部分。正确的表达式可能如下所示:
if (direction == null || (!direction.equals("up") && !direction.equals("down") && !direction.equals("left") && !direction.equals ("right "))) {
}
但是这段代码不可读。您可以使用枚举或字符串列表,如下所示
List<String> directions = Arrays.asList("up", "down", "left", "right");
String direction = "readValue"
if (!directions.contains(direction)) {
System.out.println("Invalid direction");
System.exit(0)
}
答案 6 :(得分:0)
请尝试以下代码:
boolean match = false;
if (direction.equals("up"))
{ match = true; }
if (direction.equals("down"))
{ match = true; }
if (direction.equals("left"))
{ match = true; }
if (direction.equals("right"))
{ match = true; }
if (direction.equals(null))
{ match = true; }
if (match == false){
System.out.println("Invalid Solution file");
System.exit(0);
}
您可能还希望在从文件读取后修剪方向字符串。