这是错误选择还是有条件的? (Java)
Is this error selection or conditional? (Java)
我有一个错误,在第三个 IF 语句上。它检查用户输入的数字是否在范围 (1-6) 内并且字母是 a-f。我无法测试我的搜索算法,因为该行似乎有错误。我搞不定。似乎出了什么问题?是 answer.charAt(1)?
boolean wronganswer = true;
while (wronganswer == true){
answer = (String)JOptionPane.showInputDialog(null, new JLabel(sb.toString()), "Battleships", JOptionPane.INFORMATION_MESSAGE, pic, null, "");
if(answer.length() == 2){
if ((Character.isLetter(answer.charAt(0))) && (Character.isDigit(answer.charAt(1)))){
if ((answer.charAt(1) >= 0) && (answer.charAt(1) <= 6)){
for (int k = 0; k < rows.length; k++){
if(rows[k] == (""+answer.charAt(0))){
wronganswer=false;
}
}
JOptionPane.showMessageDialog(null,"No! That letter is not on the grid!");
}
else{
JOptionPane.showMessageDialog(null,"No! That number is not on the grid!");
System.out.println(answer.charAt(1));
}
}
else{
JOptionPane.showMessageDialog(null,"No! Enter a letter, THEN a number!");
}
}
else{
JOptionPane.showMessageDialog(null,"No! Enter ONE letter and ONE number!");
}
}
[编辑] 修复了粘贴到堆栈溢出时的缩进错误
这是由于 ==
将引用与匿名临时 java.lang.String
进行比较,后者始终为 false
。修复很简单;使用
rows[k].equals("" + answer.charAt(0));
相反,它比较字符串内容。你可以使用更华丽的 Yoda Expression
("" + answer.charAt(0)).equals(rows[k])
如果 rows[k]
是 null
,则不会抛出 NullPointerException
。
在您的代码中:
if ((answer.charAt(1) >= 0) && (answer.charAt(1) <= 6)){
你得到一个 char
。即使你的字符是一个数字,它的值也是它的 ASCII value.
所以您的条件实际上不会测试您是否输入了 0 到 6 之间的数字,但它会测试您的字符是 NUL、SOH、STX、ETX、EOT、ENQ 还是 ACK。
如果你想检查你的字符是否是一个范围内的数字,你必须在你的范围限制数字周围添加单引号:
if ((answer.charAt(1) >= '0') && (answer.charAt(1) <= '6')){
或用 ASCII 值替换限制:
if ((answer.charAt(1) >= 48) && (answer.charAt(1) <= 54)){
我有一个错误,在第三个 IF 语句上。它检查用户输入的数字是否在范围 (1-6) 内并且字母是 a-f。我无法测试我的搜索算法,因为该行似乎有错误。我搞不定。似乎出了什么问题?是 answer.charAt(1)?
boolean wronganswer = true;
while (wronganswer == true){
answer = (String)JOptionPane.showInputDialog(null, new JLabel(sb.toString()), "Battleships", JOptionPane.INFORMATION_MESSAGE, pic, null, "");
if(answer.length() == 2){
if ((Character.isLetter(answer.charAt(0))) && (Character.isDigit(answer.charAt(1)))){
if ((answer.charAt(1) >= 0) && (answer.charAt(1) <= 6)){
for (int k = 0; k < rows.length; k++){
if(rows[k] == (""+answer.charAt(0))){
wronganswer=false;
}
}
JOptionPane.showMessageDialog(null,"No! That letter is not on the grid!");
}
else{
JOptionPane.showMessageDialog(null,"No! That number is not on the grid!");
System.out.println(answer.charAt(1));
}
}
else{
JOptionPane.showMessageDialog(null,"No! Enter a letter, THEN a number!");
}
}
else{
JOptionPane.showMessageDialog(null,"No! Enter ONE letter and ONE number!");
}
}
[编辑] 修复了粘贴到堆栈溢出时的缩进错误
这是由于 ==
将引用与匿名临时 java.lang.String
进行比较,后者始终为 false
。修复很简单;使用
rows[k].equals("" + answer.charAt(0));
相反,它比较字符串内容。你可以使用更华丽的 Yoda Expression
("" + answer.charAt(0)).equals(rows[k])
如果 rows[k]
是 null
,则不会抛出 NullPointerException
。
在您的代码中:
if ((answer.charAt(1) >= 0) && (answer.charAt(1) <= 6)){
你得到一个 char
。即使你的字符是一个数字,它的值也是它的 ASCII value.
所以您的条件实际上不会测试您是否输入了 0 到 6 之间的数字,但它会测试您的字符是 NUL、SOH、STX、ETX、EOT、ENQ 还是 ACK。
如果你想检查你的字符是否是一个范围内的数字,你必须在你的范围限制数字周围添加单引号:
if ((answer.charAt(1) >= '0') && (answer.charAt(1) <= '6')){
或用 ASCII 值替换限制:
if ((answer.charAt(1) >= 48) && (answer.charAt(1) <= 54)){