试图为出生年份创建一个do while循环

时间:2016-10-04 04:41:04

标签: java validation loops while-loop

这就是问题所在。

编写一个包含do / while循环的Java代码块,该代码将在一个人的出生年份读取。出生年份必须大于1900,但小于2016年,否则用户将收到错误消息。循环必须继续提示用户,直到输入有效值。

这是我的回答

 private static double saveYears() {
    double birthYear;
    do {
     try {
          birthYear= Double.parseDouble(JOptionPane.showInputDialog("enter year you were born"));
     }
     catch (NumberFormatException e) {
        birthYear= -1;
     }
     if (birthYear> 1990 || birthYear< 2016) {
        JOptionPane.showMessageDialog(null, "Invalid number birth year.");
     }
    } while (birthYear<1990|| birthYear> 2016);

    return birthYear;
}

这是正确答案吗?

3 个答案:

答案 0 :(得分:3)

首先,我要假设你在if和while语句中的意思是1900而不是1990年。

你关闭了,但是如果你看看你的if和while语句,他们实际上正在测试不同的东西。如果您更改if语句以匹配while语句,那么您将是正确的。

private static double saveYears() {
  double birthYear;
  do {
    try {
      birthYear= Double.parseDouble(JOptionPane.showInputDialog("enter year you were born"));
    }
    catch (NumberFormatException e) {
      birthYear= -1;
    }
    if (birthYear < 1900 || birthYear > 2016) {
      JOptionPane.showMessageDialog(null, "Invalid number birth year.");
    }
  } while (birthYear < 1900 || birthYear > 2016);

   return birthYear;
}

更新: 如果你不想在一个循环中检查出生年份两次,你也可以这样做。

private static double saveYears() {
  double birthYear;
  while(true) {
    try {
      birthYear= Double.parseDouble(JOptionPane.showInputDialog("enter year you were born"));
    }
    catch (NumberFormatException e) {
      birthYear= -1;
    }
    if (birthYear >= 1900 && birthYear <= 2016) {
      break;
    } else {
      JOptionPane.showMessageDialog(null, "Invalid number birth year.");
    }
  return birthYear;
  }

答案 1 :(得分:0)

您的状况检查使用不当,请使用less than/greater than and =在1990年和2016年再次循环。

while(birthYear <= 1900 || birthYear >= 2016);

并且不需要double,使用int这是绰绰有余并限制为4位数(根据规范1900或2016 - >不超过4位数)< / p>

答案 2 :(得分:0)

您正在使用(birthYear> 1990 || birthYear< 2016),这意味着,

  1. 大于1990的所有值都将通过此条件
  2. 小于2016的所有值都将通过此条件
  3. 来自1&amp; 2,基本上所有年份都会通过这个条件
  4. 使用运营商||更改运营商&&可以解决您的问题。还要考虑以下几点:

    1. 检查1990年和2016年是包含值还是包含值。它将确定应使用运营商<>的位置,或者应使用运营商<=>=
    2. 为什么double出生年份?
    3. 您已检查过两次相同的情况,这很容易出错。将条件减少到一个地方,如:

          int birthYear = -1;
          boolean isYearInvalid = true;
          while (isYearInvalid) {
              try {
                  birthYear = Integer.parseInt(JOptionPane.showInputDialog("enter year you were born"));
              } catch (NumberFormatException e) {
                  //LOG or PRINT
              }
      
              if (birthYear > 1900 && birthYear < 2016) {
                  isYearInvalid = false;
              } else {
                  JOptionPane.showMessageDialog(null, "Invalid number birth year.");
              }
          }