首先,问题如下: 编写一个程序,提示用户输入DDD-DD-DDDD格式的社会安全号码,其中D是一个数字。您的程序应检查输入是否有效。以下是示例运行:
Enter a SSN: 232-23-5435
232-23-5435 is a valid Social Security Number.
另一项测试:
Enter a SSN: 23-23-5435
23-23-5435 is an invalid Social Security Number.
我的代码如下:
import java.util.Scanner;
public class SSN {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Please enter a Social Security Number in the format DDD-DD-DDDD: ");
String ssn = input.nextLine();
boolean correct = true;
if (ssn.length() != 11) {
correct = false;
} else {
if (!('0' <= ssn.charAt(0) && ssn.charAt(0) <= '9')) {
correct = false;
}
if (!('0' <= ssn.charAt(1) && ssn.charAt(1) <= '9')) {
correct = false;
}
if (!('0' <= ssn.charAt(2) && ssn.charAt(2) <= '9')) {
correct = false;
}
if (ssn.charAt(3) != '-') {
correct = false;
}
if (!('0' <= ssn.charAt(4) && ssn.charAt(4) <= '9')) {
correct = false;
}
if (!('0' <= ssn.charAt(5) && ssn.charAt(5) <= '9')) {
correct = false;
}
if (ssn.charAt(6) != '-') {
correct = false;
}
if (!('0' <= ssn.charAt(7) && ssn.charAt(7) <= '9')) {
correct = false;
}
if (!('0' <= ssn.charAt(8) && ssn.charAt(8) <= '9')) {
correct = false;
}
if (!('0' <= ssn.charAt(9) && ssn.charAt(9) <= '9')) {
correct = false;
}
if (!('0' <= ssn.charAt(10) && ssn.charAt(10) <= '9')) {
correct = false;
}
}
if (correct == true) {
System.out.println(ssn + " is a valid Social Security Number.");
} else {
System.out.println(ssn + " is an ivalid Social Security Number.");
}
}
}
但是在询问我的教授后,这是一个正确的答案。
但是,我仍然不明白为什么我需要在if if语句之间使用else{}
。
如果我取走else{}
,它适用于正确的SSN,但当我输入无效的内容时,返回:
Please enter a Social Security Number in the format DDD-DD-DDDD: sd
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 2
at java.lang.String.charAt(Unknown Source)
at SSN.main(SSN.java:22)
问题是什么?为什么我需要else
?程序是否只检查每个if语句,并通过检查correct
是否正确错误来给出输出?
我的意思是,即使没有其他,即使有更多的计算,但它不应该有相同的工作吗?
我弄错了什么,请帮助,谢谢!
答案 0 :(得分:0)
首先if
检查输入是否有正确的长度。如果不是,它将不会检查其他条件。
如果您删除else
,则会检查所有条件。因此,如果您有5个长度输入,则在访问第六个字符时会得到StringIndexOutOfBoundsException
。
您可以使用Pattern.compile(regex)
,然后检查正则表达式是否与您的输入匹配,而不是编写此类unclean code ifs
答案 1 :(得分:0)
因为你正在尝试阅读一个不存在的角色。如果您的输入字符串短于9个字符,则以下代码将抛出keypress
StringIndexOutOfBoundsException