关于else语句(java)

时间:2016-09-13 22:49:37

标签: java

首先,问题如下: 编写一个程序,提示用户输入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是否正确错误来给出输出?

我的意思是,即使没有其他,即使有更多的计算,但它不应该有相同的工作吗?

我弄错了什么,请帮助,谢谢!

2 个答案:

答案 0 :(得分:0)

首先if检查输入是否有正确的长度。如果不是,它将不会检查其他条件。

如果您删除else,则会检查所有条件。因此,如果您有5个长度输入,则在访问第六个字符时会得到StringIndexOutOfBoundsException

您可以使用Pattern.compile(regex),然后检查正则表达式是否与您的输入匹配,而不是编写此类unclean code ifs

答案 1 :(得分:0)

因为你正在尝试阅读一个不存在的角色。如果您的输入字符串短于9个字符,则以下代码将抛出keypress

StringIndexOutOfBoundsException