程序停止打印这两个邮件
我有一些代码在这里,我试图让用户输入一个字母, 数字或符号,我让他们都工作,但是当我输入一个字母,它打印出“你已经输入了一个字母”和“你已经输入了一个 符号”。但是事情是,我从来没有在第一个地方输入一个符号,只是一个 字母。继承人如何看起来:程序停止打印这两个邮件
输入一个字符:
d
你所输入的字母!
您输入了SYMBOL!
import static java.lang.System.*;
import java.util.*;
public class Java1304
{
public static void main(String[] args)
{
new Problem();
}
}
class Problem
{
char letter;
public Problem()
{
input();
process();
output();
}
void input()
{
Scanner scan = new Scanner(in);
out.println("Enter a SINGLE character:");
letter = scan.nextLine().charAt(0);
}
void process()
{
if(Character.isLetter(letter))
{
out.println("You entered a LETTER!");
}
if(Character.isDigit(letter))
{
out.println("You entered a NUMBER!");
}
if(!Character.isLetter(letter) || !Character.isDigit(letter))
//else
out.println("You entered a SYMBOL!");
}
void output()
{
out.println();
out.println();
out.println();
}
}
您希望的行为未反映在您所写的代码中。如果字符不是字母或不是数字(因为||是or的逻辑运算符),则语句!Character.isLetter(letter) || !Character.isDigit(letter)
的计算结果为true。回到您的示例,如果您键入“A”,Character.isDigit(letter)
的计算结果为false,因此!Character.isDigit(letter)
的计算结果为true,因此!Character.isLetter(letter) || !Character.isDigit(letter)
的计算结果为true。
根据你的榜样,你如果块可以更好地写为:
if(Character.isLetter(letter)){
out.println("You entered a LETTER!");
} else if(Character.isDigit(letter)){
out.println("You entered a NUMBER!");
} else {
out.println("You entered a SYMBOL!");
}
你的第二个,如果因为!Character.isLetter(letter)
是真实的说法是正确的。 ||
是逻辑or
。这意味着如果其中一个陈述是真实的,它将进入if子句。
所以,只要改变最后一个,如果对于别人,你应该没问题。
你的问题是,如果最后让陈述书的通过你的使用情况步骤有:
你进入D
。
isLetter('D')
是true
所以它打印
isDigit('D')
是false
使得不打印
!isLetter('D') && !isDigit('D')
相同
! true || ! false
(评价方法调用),其是相同 false || true
(评估!
's),其与 true
相同(评估||
)所以它打印。
要解决该问题,您可以将||
更改为&&
,或将您注释掉的else
条款恢复原样。我个人认为else
条款是一个更好的解决方案,因为它明确表达了你的想法,即不是一个字母而不是一个数字必须是一个符号,而不必明确检查每一个。
if(!Character.isLetter(letter) || !Character.isDigit(letter))
您已使用或代替AND,所以当你检查!Character.isDigit(letter)
在过去的if语句,改变字母“d”将传递||到& &。