Java忽略if-else语句

时间:2016-02-04 21:22:14

标签: java

我上学的任务是在java中编写一个程序,接受来自System.in.read()的四位数条目;并计算它是否是闰年,然后告诉用户它是否是闰年,然后提供重启程序的选项。此外,如果用户在1582年之前输入一年,它将告诉他们错误,然后是程序重置选项。

---------------------------------------------------------------------------
ProgrammingError                          Traceback (most recent call last)
<ipython-input-34-c26e11f8fb81> in <module>()
----> 1 cur.execute(sql)

ProgrammingError: syntax error at or near "c"
LINE 1: COPY sept_2014 (easting,northing,texture) FROM c:\Users\dan\...
                                                       ^

但出于某种原因,当我重新启动程序并输入一年时,无论如何都会在1582之前说出它,并显示所有行,直到重置提示不停止。

public class RevisedLeapYear {
    public static void main(String args[])
    throws java.io.IOException {

    char restartChoice = 'y';
    int readCh, year=0, i;
    boolean isLeapYear;

    while(restartChoice == 'y' || restartChoice == 'Y'){
        System.out.print("Enter target year: ");
        for(i = 0; i < 4; i++)//start for
        {
            readCh = (int)System.in.read();
            switch(i) //start switch
            {//converts in to 4 digits
                case 0: year = (int)((readCh - 48) * 1000); break;
                case 1: year = year + (int) ((readCh - 48) * 100); break;
                case 2: year = year + (int) ((readCh - 48) * 10); break;
                case 3: year = year + (int) (readCh - 48);
            }//end switch
    }//end for
        isLeapYear = ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0));
                if(isLeapYear == true && year > 1581){
                System.out.println(year + " is a Leap Year! What a time to be alive! \nPress Enter to continue.");
            }
                else if(isLeapYear == false && year > 1581){
                System.out.println(year + " is not a Leap Year... how unfortunate. \nPress Enter to continue.");
            }
            else{
                System.out.println("There are no leap years before 1582! \nPress Enter to continue.");
            }
    readCh = System.in.read(); // Clear the carriage return in the buffer
    readCh = System.in.read(); // Clear the linefeed in the buffer

    System.out.print("Reset program? y/n \n");
    restartChoice=(char)System.in.read();

    }              
}
}
编辑:我自己修理了它。问题是这一年没有从缓冲区清除。我把它添加到最后一行。

Enter target year: 2004
2004 is a Leap Year! What a time to be alive! 
Press Enter to continue.

Reset program? y/n 
y
Enter target year: 2003
There are no leap years before 1582! 
Press Enter to continue.
Reset program? y/n 
n
BUILD SUCCESSFUL (total time: 21 seconds)

将此作为最终产品。

year=(int)System.in.read();

3 个答案:

答案 0 :(得分:1)

你的问题在于处理行尾。

您忘记了用户输入的每个输入后面都是行尾。这可以是回车,回车和换行。

您的程序以四个字节读取。当用户输入这些字节时,他也按 Return 。这会在流中插入一个字节。

因为您告诉用户“按Enter继续”,用户再次按返回。这会在流中插入另一个字节。

然后从流中清除两个字节。您假设已删除回车符和换行符。但实际上你刚刚删除了一年后的回车,以及另外一个被按下的回车。

现在您要求用户yn。但要输入,用户单击 y 返回。所以他将两个字符输入到流中。 restartChoice只获取其中一个 - yn,但回车仍在输入流中。然后返回循环的头部,打印提示并启动for循环。此时,您阅读了回车。只有这样,你才能在明年开始阅读。

因此,如果您的下一年字符串为2003,那么您在循环中实际得到的是 CR 2 0 0 。您的年度计算变为(13-48)*1000 + (50-48)*100 + (48-48)*10 + (48-48) - 这是一个非常小的数字,因为第一项是负数。

所以它告诉你你输入的年份是在1580年之前。

  • 始终使用Reader来阅读文字。不要尝试读取原始字节并自行转换它们。首先,您不知道您的机器是否只会在每行末尾输入一个返回或返回和换行。当您更熟练编程时,可以尝试为这些情况编写输入处理程序。但这并不是必需的 - 您已经拥有了可以使用的各种Reader,或Scanner这对初学者来说非常好。
  • 如果要解释数字,请务必确保它由有效数字组成。
  • 还有逻辑错误的问题。您不应该在for内使用switch。由于您已经在交换机中单独编写了每个操作,因此您可以完全删除该循环并直接检查字符:

    System.out.print("Enter target year: ");
    readCh = (int) System.in.read();
    year = (int) ((readCh - 48) * 1000);
    readCh = (int) System.in.read();
    year = year + (int) ((readCh - 48) * 100);
    readCh = (int) System.in.read();
    year = year + (int) ((readCh - 48) * 10);
    readCh = (int) System.in.read();
    year = year + (int) (readCh - 48);
    

    这不比循环中的开关简单吗?

  • 你应首先检查年份是否大于1581年,并且只有当它是,否则检查它是否是跳跃。

答案 1 :(得分:0)

我稍微重新安排了您的代码,并将System.in.read()替换为Scanner。之后一切正常。问题出在您的System.in.read()声明中。

public static void main(String[] args)
{  
    char restartChoice = 'y';
    int year=0;
    boolean isLeapYear;
    Scanner scn = new Scanner(System.in);

    while(restartChoice == 'y' || restartChoice == 'Y'){
        System.out.print("Enter target year: ");
        year = Integer.parseInt(scn.nextLine());

        isLeapYear = ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0));

        if(isLeapYear && year > 1581)
            System.out.println(year + " is a Leap Year! What a time to be alive! \nPress Enter to continue.");    
        else if(!isLeapYear && year > 1581)
            System.out.println(year + " is not a Leap Year... how unfortunate. \nPress Enter to continue.");            
        else
            System.out.println("There are no leap years before 1582! \nPress Enter to continue.");

        System.out.print("Reset program? y/n \n");
        restartChoice = scn.nextLine().charAt(0);
    }              
}

答案 2 :(得分:0)

问题不在于你的if else语句,而在于System.in.read()是如何在第二次读取它的,因为它没有再次读取它。

您可能想了解如何使用扫描仪。