Java 在调试和运行期间,由于某种原因跳过了内部if语句

Java 在调试和运行期间,由于某种原因跳过了内部if语句,java,if-statement,for-loop,nested-if,Java,If Statement,For Loop,Nested If,内部if语句被完全跳过,当我逐步遍历代码时,它从未进入updateGrade。它只是完全跳过了if。为什么? 以下是所讨论的方法: public void updateCourse(String courseID, String newLetterGrade){ for(int i=0; i<classesTaken.size(); i++){ if(classesTaken.contains(courseID)){ classesTaken.g

内部if语句被完全跳过,当我逐步遍历代码时,它从未进入updateGrade。它只是完全跳过了if。为什么?

以下是所讨论的方法:

public void updateCourse(String courseID, String newLetterGrade){

    for(int i=0; i<classesTaken.size(); i++){

        if(classesTaken.contains(courseID)){
        classesTaken.get(i).updateGrade(newLetterGrade);
        }
    }
}
我的测试文件如下所示:

public class TranscriptTester {

public static void main(String[] args){
    Transcript test = new Transcript("11234", "Cody");
    test.addCourse("COP2013","A+");
    test.addCourse("COP2014","B+");
    test.addCourse("COP2015","B+");
    test.addCourse("COP2016","D+");
    test.addCourse("COP2017","A");
    test.addCourse();
    test.updateCourse("COP2013", "B-");
    test.updateCourse("COP2014", "A+");
    test.getGPA();
    test.printArray();
    test.toString();
}
}
根据我的代码,它应该在classesTaken的第一次迭代时跳入if语句,因为COP2013的索引为0

如果你需要更多的信息来帮助我,尽管问。谢谢

如果您想查看所有类文件,请参见以下所有类文件:

public class Course {

//global variables
private String courseID;
private String letterGrade;
private Double numberGrade;

//CONSTRUCTORS
//param
public Course(String id, String letter){
courseID = id;
letterGrade=letter;
compute(letter);
}
//default
public Course(){
    courseID = "COP2053";
    numberGrade = 4.0;
    letterGrade = "A";
    compute(getLetterGrade());
}


//COMPUTING GRADES AND UPDATING
private void compute(String letter){


    if(letter == "A+"){numberGrade = 4.0;}
    else if(letter == "A"){numberGrade = 3.67;}
    else if(letter == "A-"){numberGrade = 3.33;}
    else if(letter == "B+"){numberGrade = 3.00;}
    else if(letter == "B"){numberGrade = 2.67;}
    else if(letter == "B-"){numberGrade = 2.33;}
    else if(letter == "C+"){numberGrade = 2.00;}
    else if(letter == "C"){numberGrade = 1.67;}
    else if(letter == "C-"){numberGrade = 1.33;}
    else if(letter == "D+"){numberGrade = 1.0;}
    else if(letter == "D"){numberGrade = .67;}
    else if(letter == "D-"){numberGrade = .33;}
    else if(letter == "F"){numberGrade = 0.0;}

}

public void updateGrade(String newGrade){
    letterGrade=newGrade;
    compute(newGrade);
}

@Override
public String toString(){
    return "\nCourse: "+getCourseID()+"\nLetter Grade: "+getLetterGrade()
          +"\nGPA in course: "+numberGrade;

}




//GETTERS
public String getCourseID(){
    return courseID;
}

public String getLetterGrade(){
    return letterGrade;
}

public Double getNumberGrade(){
    return numberGrade;
}



}
成绩单档案:

public class Transcript {

private ArrayList<Course> classesTaken = new ArrayList<Course>();

public Transcript(String studentID, String studentName){
     System.out.println("\nStudent ID: "+studentID+"\nStudent Name: "+studentName);
}

public void addCourse(String courseID, String letterGrade){
    Course myCourse = new Course(courseID,letterGrade);
    classesTaken.add(myCourse);
}

public void addCourse(){
    Course myCourse = new Course();
    classesTaken.add(myCourse);
}

public void updateCourse(String courseID, String newLetterGrade){

    for(int i= 0; i<classesTaken.size(); i++){

        if(classesTaken.get(i).equals(courseID)){
        classesTaken.get(i).updateGrade(newLetterGrade);
        }
    }
}

public void getGPA(){
    System.out.println("\nOverall GPA: "+calculateGPA());
}

private Double calculateGPA(){
    Double overallGPA = 0.0;
    for(int i=0; i<classesTaken.size(); i++){
    overallGPA = classesTaken.get(i).getNumberGrade()+overallGPA;
    }

    return overallGPA / classesTaken.size();
}

public void printArray(){
    for(int i=0; i<classesTaken.size(); i++){
    System.out.println("\n"+classesTaken.get(i));
    }
}



}
公开课成绩单{
private ArrayList classesTaken=new ArrayList();
公开成绩单(String studentID、String studentName){
System.out.println(“\n学生ID:+studentID+”\n学生姓名:+studentName”);
}
公共void addCourse(字符串courseID,字符串letterGrade){
课程myCourse=新课程(课程ID,letterGrade);
classesTaken.add(myCourse);
}
公共课程(){
课程myCourse=新课程();
classesTaken.add(myCourse);
}
公共void updateCourse(字符串courseID,字符串newLetterGrade){

对于(inti=0;i,似乎
classesTaken
存储的是课程,而不是字符串。因此它永远不会包含ID本身


看起来你可能想要的是类似于
classesTaken.get(i).getID().equals(courseID)
的东西,假设一个
getID
函数。

只要看一下你的代码,我就知道你在滥用
方法(除非你将
equals
字符串一起使用)

classesTaken.get(i).updateGrade
您正在调用对象上的
updateGrade
(某种类型,而不是
String
),这显然不是
String
类型

但是您尝试在列表
classesTaken
列表中查找
字符串

classesTaken.contains(courseID)
显然,此列表中没有
String
。否则代码甚至无法编译(因为
String
没有
updateGrade
方法)

您应该重写
equals
或提供其他方法来确定字符串是否在自定义类的对象集合中

您应该这样做(假设您的类是
classtake
):


for(int i=0;i在updateCourse方法中,您正在将课程对象(classesTaken ArrayList中的项目)与字符串对象(courseID)进行比较。因此,if条件永远不会满足

与下面一样,重写Course类中的equals方法,以便可以使用“contains”方法来比较课程

@Override
public boolean equals(Object other){
    if (other == null) return false;
    if (other == this) return true;
    if (!(other instanceof Course))return false;
    Course otherCourse = (Course)other;
    return this.courseID.equals(otherCourse.courseID);
}
然后还需要更新Transcript类中的updateCourse方法,以确保相同类型的对象被比较:

public void updateCourse(String courseID, String newLetterGrade){   
    Course c = new Course(courseID, newLetterGrade);    
    for(int i= 0; i<classesTaken.size(); i++){
        if(classesTaken.get(i).equals(c)){
            classesTaken.get(i).updateGrade(newLetterGrade);
        }
    }
}
public void updateCourse(String courseID,String newLetterGrade){
课程c=新课程(课程ID,新等级);

对于(int i=0;如果你告诉我们什么是“Transcript”和“classesTaken”,那会有很大帮助。我也很好奇classesTaken.contains()应该做什么。你在循环内调用它,但它不以“i”为参数,所以为什么不在循环外调用它呢?或者你是说classesTaken.get(i).contains()?小心,你不能使用“=”这不是我想要的,但它确实给了我一些想法,谢谢!
@Override
public boolean equals(Object other){
    if (other == null) return false;
    if (other == this) return true;
    if (!(other instanceof Course))return false;
    Course otherCourse = (Course)other;
    return this.courseID.equals(otherCourse.courseID);
}
public void updateCourse(String courseID, String newLetterGrade){   
    Course c = new Course(courseID, newLetterGrade);    
    for(int i= 0; i<classesTaken.size(); i++){
        if(classesTaken.get(i).equals(c)){
            classesTaken.get(i).updateGrade(newLetterGrade);
        }
    }
}