Java if语句逻辑

Java if语句逻辑,java,if-statement,logic,Java,If Statement,Logic,我的任务是为我正在学习的一门课程创建一个小型java程序,我对以下代码块有一些问题: System.out.println("Please enter your first name:"); userName = sc.nextLine(); System.out.println("What year were you born in?"); birthYear = sc.nextInt(); System.out.println("In the

我的任务是为我正在学习的一门课程创建一个小型java程序,我对以下代码块有一些问题:

        System.out.println("Please enter your first name:");
    userName = sc.nextLine();
    System.out.println("What year were you born in?");
    birthYear = sc.nextInt();
    System.out.println("In the 'dd.mm' format, what are the day and month of your birth?");
    dayMonth = sc.nextDouble();
    //Cast the user input of type double to an int for the day of Birth
    dayOfBirth = dayMonth.intValue();

    //Cast the double value for month and cast it to an int
    dayMonth = dayMonth - dayOfBirth;
    dayMonth = dayMonth * 100;
    dayMonth = Math.rint(dayMonth);
    monthOfBirth = dayMonth.intValue();
if(birthYear == 2013 || birthYear == 2001 || birthYear == 1989 || birthYear == 1977 || birthYear == 1965 || birthYear == 1953 || birthYear == 1941)
{
    if(monthOfBirth == 9 || monthOfBirth == 10 || monthOfBirth == 11)
    {
        System.out.println(userName + " was born during Spring on " + monthOfBirthName + " " + dayOfBirth + " in Snake year " + birthYear);
    }
        else if(monthOfBirth != 9 || monthOfBirth != 10 || monthOfBirth != 11)
        {
            System.out.println(userName + " was born on " + monthOfBirthName + " " + dayOfBirth + " in Snake year " + birthYear);
        }
}
if(birthYear != 2013 || birthYear != 2001 || birthYear != 1989 || birthYear != 1977 || birthYear != 1965 || birthYear != 1953 || birthYear != 1941)
{
     if(monthOfBirth == 9 || monthOfBirth == 10 || monthOfBirth == 11)
    {
        System.out.println(userName + " was born during Spring on " + monthOfBirthName + " " + dayOfBirth + " " + birthYear);
    }   
        else if(monthOfBirth != 9 || monthOfBirth != 10 || monthOfBirth != 11)
        {
            System.out.println(userName + " was born on " + monthOfBirthName + " " + dayOfBirth + " " + birthYear);
        }
}
然而,我的输出结果如下:

Please enter your first name:

Samuel

What year were you born in?

1977

In the 'dd.mm' format, what are the day and month of your birth?

09.09

Samuel was born during Spring on September 9 in Snake year 1977

Samuel was born during Spring on September 9 
我显然不希望重复输出,但是我很难看到if语句中的逻辑在哪里导致重复输出

任何帮助都将不胜感激

谢谢大家


~Sam.

不要单独使用2个
if
,而是将它们设置为
if else
if else if

if(birthYear == 2013 || birthYear == 2001 || birthYear == 1989 || birthYear == 1977 || birthYear == 1965 || birthYear == 1953 || birthYear == 1941){
    ....
}
else if(birthYear != 2013 || birthYear != 2001 ||...){
....
}

因为,如果你给出一个
if
,两个
if
语句都将被执行,而如果你给出一个
if-else-if
,第二个
else-if
语句只有在第一个
if
语句失败的情况下才会被执行。

尽可能使用else语句,因此如果你测试2013年、2001年。。。
在后面,做一个else语句

如果一切都在哪里,则应该替换第二个语句!=使用简单的“else”,因为您已经检查了其中的任何语句是否为真。因此,简单地编写else在逻辑上是平等的,并且可读性更高

if(birthYear == 2013 || birthYear == 2001 || birthYear == 1989 || birthYear == 1977 || birthYear == 1965 || birthYear == 1953 || birthYear == 1941){
    ....
}
else { //not snake year
    ....
}
问题在于

if(birthYear != 2013 || birthYear != 2001 || birthYear != 1989 || birthYear != 1977 || birthYear != 1965 || birthYear != 1953 || birthYear != 1941
如果您仔细观察,我们将确保表达式总是导致try。一次最多只能有一个是假的,所有其他的都是真的,因此最后它总是真的(困惑?)。假设出生年份是2013年,这使得第一个条件(生日!=2013)为假,但所有其他条件都为真。再举个例子,你就会明白我想说什么了

实际上,一个小小的修改就能为您修复代码。您已经检查了
如果(生日在给定年份中)
,那么一个没有任何条件的简单else将适用于您

if(birthYear == 2013 || birthYear == 2001 || birthYear == 1989 || birthYear == 1977 || birthYear == 1965 || birthYear == 1953 || birthYear == 1941)
{
    if(monthOfBirth == 9 || monthOfBirth == 10 || monthOfBirth == 11)
    {
        System.out.println(userName + " was born during Spring on " + monthOfBirthName + " " + dayOfBirth + " in Snake year " + birthYear);
    }
        else// NO CHECK REQUIRED NOW
        {
            System.out.println(userName + " was born on " + monthOfBirthName + " " + dayOfBirth + " in Snake year " + birthYear);
        }
}
//SEE THIS
else{
     if(monthOfBirth == 9 || monthOfBirth == 10 || monthOfBirth == 11)
    {
        System.out.println(userName + " was born during Spring on " + monthOfBirthName + " " + dayOfBirth + " " + birthYear);
    }   
//AND
        else 
        {
            System.out.println(userName + " was born on " + monthOfBirthName + " " + dayOfBirth + " " + birthYear);
        }
}

如果第二部分错误:

if(birthYear != 2013 || birthYear != 2001 || ....)
因为它总是真实的。 只需查看一个视图示例: 如果你有2012年,而不是2013年,那么你的表达就变成了真。 如果您选择2013年,则第一部分为假,但当您评估2013年时!=2001年,它再次成为现实

你可能想要的是

if(birthYear == 2013 || birthYear == 2001 || birthYear == 1989 || birthYear == 1977 || birthYear == 1965 || birthYear == 1953 || birthYear == 1941)
{
.....
}
else {
.....
}

顺便说一下:如果要对表达式求反(x==A | | x==B | | x==C),则逻辑求反为(x!=A&&x!=B&&x!=C)。

您可以选择以下解决方案之一:

1) 在第二个if语句中使用&&运算符而不是| |


2) if(){}else{}//Kamal的解

答案在你的条件中

假设
dob=1

if(dob == 1 || dob == 2 || dob == 3 ...)
将计算为true,因为dob==1

if (dob != 1 || dob != 2 || dob != 3 ...)
也将计算为true,因为dob!=二,


您想要使用的是
/
&&
,而不是
/
| |

更好地使用集合,而不是多个if(…==…=…| |…==…| |…)

像这样:

List<String> wrongYears = Arrays.asList("2013", "2001", "1989", "1977", ...);
几个月的数字都是一样的


您的逻辑错误很明显

第二个
sysout
是第二个
if
执行的结果,即使执行了
if
。因此,答案是肯定的。OP希望避免打印第二个
if
。根据我的回答,
else if
可以替换为
else
。如果出生年不是龙年,那么就不是龙年。不需要再核对所有年份。不要重复你自己的话。@AlexanderBrevig-我在回答的第一行已经提到了这一点。但如果
,则不能假定OP在第二个
处停止。如果他后来有了
龙年
,而
没有龙年
,那该怎么办呢?我喜欢这个网站。你们真是帮了大忙。感谢您的解决方案,该程序现在运行良好。:)对于非特殊年份的每一年,仅使用
else
始终是正确的选择。(我只是读了你的第一个初步答案,我看到你现在已经更新了,虽然很可能是你当时也提到了。我错了)嗨,山姆,你和我哥哥的名字一模一样!不要把这当作侮辱,而是建设性的批评。您需要更好地格式化代码。查看一个真正的样式:。如果使用eclipse,还可以使用
CTRL-SHIFT-F
自动格式化。它节省了很多时间!许多编辑器可以为您自动设置格式。调查一下,兄弟!;)
if(wrongYears.contains(birthYear)
{
 ...
}