Java 为什么会有一个;“死枝”;在我的代码里?

Java 为什么会有一个;“死枝”;在我的代码里?,java,if-statement,boolean,Java,If Statement,Boolean,下面是我的代码,在我最后一次使用if-else之前,它一直运行良好。看来我的布尔变量cangradeate和onpermission有问题。也许我在前面的if-else语句中错误地重新分配了它们。deadbranch发生在我最后一个if else的else一半 package lab5; import java.util.Scanner; public class Lab5 { public static void main(String[] args) { //creates sc

下面是我的代码,在我最后一次使用if-else之前,它一直运行良好。看来我的布尔变量cangradeate和onpermission有问题。也许我在前面的if-else语句中错误地重新分配了它们。deadbranch发生在我最后一个if else的else一半

package lab5;
import java.util.Scanner;
public class Lab5 {

public static void main(String[] args) {

    //creates scanner object
    Scanner scanner = new Scanner(System.in);

    //PART II
    //creating variables
    double gpa;
    int totalCreditsTaken;
    int mathScienceCredits;
    int liberalArtsCredits;
    int electiveCredits;
    boolean canGraduate = true;
    boolean onProbation = false;

    //prompts user for imput
    System.out.println("What is your GPA?");
        gpa = scanner.nextDouble();
    System.out.println("What's the total amount of credits you've taken?");
        totalCreditsTaken = scanner.nextInt();
    System.out.println("How many math and science credits have you taken?");
        mathScienceCredits = scanner.nextInt();
    System.out.println("How many liberal arts credits have you taken?");
        liberalArtsCredits = scanner.nextInt();
    System.out.println("How many elective credits have you taken?");
        electiveCredits = scanner.nextInt();

    //creates first "if" statment to determine if GPA is high enough to be on track or on probation 
    if (gpa < 2.0){
        System.out.println("You're on academic probation.");
        onProbation = true;
    }

    //PART III
    //creates a conditional to see if there's enough credits to graduate 
    if (totalCreditsTaken < 40 ){
        System.out.println("You need more credit(s) to graduate.");
        canGraduate = false;
    }
    else{
        System.out.println("Examining credit breakdown...");
        canGraduate = true;
    }

    //PART VI
    //Nested if-else if-else to determine if the student qualifies for BA or BS
    if ((mathScienceCredits >= 9) && (electiveCredits >= 10)){
        System.out.println("You qualify for a BS degree.");
        canGraduate = true;
    }
    else if ((liberalArtsCredits >= 9) && (electiveCredits >= 10)){
        System.out.println("You qualify for a BA degree.");
        canGraduate = true;
    }
    else{
        System.out.println("You currently don't meet the degree requirments.");
        canGraduate = false;
    }

    //PART V
    //Uses an if statement to either congradulate the student or tell the student to take more classes
    if ((onProbation = true) || (canGraduate = false)){
        System.out.println("You don't qualify to graduate.");
    }
    else{
        System.out.println("Congradualations you qualify to graduate.");
    }

}
}
lab5包装;
导入java.util.Scanner;
公共类Lab5{
公共静态void main(字符串[]args){
//创建扫描仪对象
扫描仪=新的扫描仪(System.in);
//第二部分
//创建变量
双gpa;
国际信贷总额;
国际数学科学学分;
国际自由信贷;
国际选修学分;
布尔值cangradeate=true;
布尔值=假;
//提示用户输入
System.out.println(“你的平均成绩是多少?”);
gpa=scanner.nextDouble();
System.out.println(“您总共获得了多少学分?”);
TotalCreditStatken=scanner.nextInt();
你修了多少数学和科学学分;
mathScienceCredits=scanner.nextInt();
你修了多少文科学分;
liberartscredits=scanner.nextInt();
你选修了多少学分;
electiveCredits=scanner.nextInt();
//创建第一个“如果”状态,以确定GPA是否足够高,可以进入正轨或试用期
如果(gpa<2.0){
System.out.println(“你正在接受学术试用。”);
试用期=真实;
}
//第三部分
//创建一个条件,看看是否有足够的学分毕业
如果(总信用记录<40){
println(“你需要更多的学分才能毕业。”);
CANGRADUDE=假;
}
否则{
System.out.println(“检查信用细分…”);
CANGRADUDE=正确;
}
//第六部分
//嵌套if-else if-else,以确定学生是否有资格获得学士学位或学士学位
如果((数学科学学分>=9)和&(选修学分>=10)){
System.out.println(“你有资格获得学士学位”);
CANGRADUDE=正确;
}
如果((自由信用>=9)和&(选择性信用>=10)){
System.out.println(“你有资格获得学士学位”);
CANGRADUDE=正确;
}
否则{
System.out.println(“您目前不符合学位要求。”);
CANGRADUDE=假;
}
//第五部分
//使用if语句祝贺学生或告诉学生多上课
如果((试用期=真)| |(canGraduate=假)){
System.out.println(“你没有资格毕业。”);
}
否则{
System.out.println(“祝贺你有资格毕业。”);
}
}
}

您正在此处分配值:

if((onpermission=true)| |(canGraduate=false)){

您需要使用
=
来比较它们

更新(评论后)

更好的是,不要比较布尔值。相反,由于
onpermission
canGraduate
都是布尔类型,因此可以使用:

if(试用期){


要归功于@realponsibilist和@FredK(在他们的评论中)

对这里发生的事情有更多的解释

在Java中,
=
运算符是赋值,而不是比较(比较运算符是
=
)。因此,如果
a
int
a=3
表示“将值3放入变量
a

但赋值也是一个表达式。除了将值放入该变量中,表达式还计算为已赋值的值

因此表达式
a=3
的值是3。您可以执行以下操作:

System.out.println( a = 3 );
这将同时将3放入
a
,并在控制台上打印
3

通常,Java不允许您混淆
=
=
。如果变量是
int
float
字符串,则编写如下语句:

if ( a = 3 ) ... // Compilation error
将不起作用,因为表达式的值是3,一个
int
值,如果
需要一个
boolean
类型的表达式,那么它将告诉您表达式是错误的,您会注意到:“哦,我的意思是
=

但是如果
a
的类型是
boolean
,那么写入
a=false
a=true
就是一个赋值,它也会返回被赋值的值,这是一个
布尔值

if ( a = false ) ... // Compiles correctly
编译器不会抱怨,因为表达式的值是
boolean
,而这正是
if
所期望的。编译器不知道您实际上想要比较。它只知道它得到了一个适当类型的表达式

因此,建议绝对不要比较
boolean
变量

if ( a == true )
写得完全正确

if ( a )
因为
if
a
true
时会成功,在
a
false
时会失败。无需比较!重要的是要像您那样给变量起个好名字-
cangradeate
是个好名字,下面的语句

if ( canGraduate )
“如果[用户]能够毕业…”的可读性很好

对于
false
,您可以使用

if ( ! canGraduate )

它在英语中听起来不太好听,但它足够清晰,比
if(canGraduate==false)
更清晰,而且你不会错过
=
和编写
if(canGraduate=false)
错了。

事实上,为了防止类似的事情发生,不要比较布尔值。
if(onpermission | | | |!canGraduate)
会做得很好。然后整个if-else语句变成了一个“deadbranch”。@realpoint-true。我只是指出了语法错误。@AutumnPickart想扩展吗?I