You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java方法与对象正确初始化问题求助

代码错误修正与面向对象优化

一、setLetterGrades方法的错误修正

原方法存在语法、逻辑多类错误,以下是修正后的代码及错误说明:

核心错误点:

  • 缺少返回类型:方法声明未指定返回类型,该方法返回字母等级字符串列表,需声明为ArrayList<String>(原代码错误使用ArrayList<Integer>,与存储内容不匹配)。
  • 未定义score变量:循环中直接使用score但未从传入的scores列表中获取元素,需通过scores.get(i)获取当前分数。
  • 变量作用域问题:grade在每个if/else块内定义,导致循环末尾无法访问,需在循环开头统一声明。
  • 分数判断逻辑矛盾:score > 60 && score <= 0逻辑完全错误,应改为score >= 0 && score < 60。

修正后的代码:

import java.util.ArrayList;

public static ArrayList<String> setLetterGrades(ArrayList<Integer> scores){ 
    ArrayList<String> grades = new ArrayList<>();

    for (int i = 0; i < scores.size(); i++){
        Integer score = scores.get(i);
        String grade;
        if (score >= 90 && score <= 100){
            grade = "A";
        }
        else if (score >= 80 && score < 90){
            grade = "B";
        }
        else if (score >= 70 && score < 80){
            grade = "C";
        }
        else if (score >= 60 && score < 70){
            grade = "D";
        }
        else if(score >= 0 && score < 60){
             grade = "F";
        }
        else {
            grade = "Invalid test score.";
        }
        grades.add(grade);
    }
    return grades;
}

二、GradeBook构造器的错误修正与面向对象优化

原构造器存在语法错误,且不符合面向对象封装原则,以下是优化后的完整类实现:

原代码错误点:

  • 参数缺少类型声明:testName未指定类型,需补充为String testName。
  • 集合初始化语法错误:ArrayList<Integer> testScores = ArrayList<Integer> scores;不符合Java语法,正确方式是通过new ArrayList<>(scores)拷贝传入集合(避免外部修改影响内部状态)。
  • 方法调用参数缺失:调用setLetterGrades()时未传入必要的分数参数。
  • 未封装成员变量:直接在构造器内定义局部变量,未作为类的成员属性,不符合面向对象设计原则。

优化后的GradeBook类(符合面向对象特性):

import java.util.ArrayList;

public class GradeBook {
    // 私有成员变量,封装类的内部状态
    private String testName;
    private ArrayList<Integer> testScores;
    private ArrayList<String> letterGrades;

    // 构造器:初始化成员变量并生成字母等级
    public GradeBook(ArrayList<Integer> scores, String testName) {
        this.testName = testName;
        // 拷贝传入的集合,避免外部修改破坏内部数据
        this.testScores = new ArrayList<>(scores);
        // 调用实例方法生成字母等级
        this.letterGrades = setLetterGrades();
    }

    // 改为私有实例方法,直接使用类内部的testScores,无需外部传参
    private ArrayList<String> setLetterGrades() {
        ArrayList<String> grades = new ArrayList<>();
        // 使用增强for循环,代码更简洁
        for (Integer score : testScores) {
            String grade;
            if (score >= 90 && score <= 100) {
                grade = "A";
            } else if (score >= 80 && score < 90) {
                grade = "B";
            } else if (score >= 70 && score < 80) {
                grade = "C";
            } else if (score >= 60 && score < 70) {
                grade = "D";
            } else if (score >= 0 && score < 60) {
                grade = "F";
            } else {
                grade = "Invalid test score.";
            }
            grades.add(grade);
        }
        return grades;
    }

    // 提供getter方法,仅暴露必要数据,且返回集合拷贝保证内部状态安全
    public String getTestName() {
        return testName;
    }

    public ArrayList<Integer> getTestScores() {
        return new ArrayList<>(testScores);
    }

    public ArrayList<String> getLetterGrades() {
        return new ArrayList<>(letterGrades);
    }
}

优化说明:

  • 封装性:将类的状态变量设为私有,仅通过getter方法对外暴露,避免外部直接修改内部数据。
  • 职责单一:setLetterGrades改为私有实例方法,仅负责处理当前GradeBook实例的分数,符合类的职责设计。
  • 数据安全:构造器和getter方法中均对集合进行拷贝,防止外部引用修改类内部的集合数据。
  • 代码简洁性:使用增强for循环替代传统索引循环,提升代码可读性。

内容的提问来源于stack exchange,提问作者Aurelia Kruger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:40:27