Java 在调试和运行期间,由于某种原因跳过了内部if语句
内部if语句被完全跳过,当我逐步遍历代码时,它从未进入updateGrade。它只是完全跳过了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
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);
}
}
}