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

无法在另一个类中设置值:设置cn后后续代码为何被跳过?

问题分析与解决方案

嘿,我来帮你拆解下代码里的问题,这也是为什么你的循环代码会被直接跳过的原因:

核心问题1:数组初始化时机错误

你在类里直接声明了private Course courses[]=new Course[cn];,但这里的cn是类的私有成员变量,在类实例化的时候,int类型的成员变量默认值是0。哪怕你之后在main方法里给cn设置了值,这个数组已经在对象创建时就被初始化成长度为0的数组了,所以for循环的条件i < courses.length(也就是i < 0)从一开始就不成立,循环体自然会被直接跳过。

核心问题2:潜在的空指针异常

就算你解决了数组长度的问题,当前代码还会抛出NullPointerException——因为你只创建了Course类型的数组容器,但数组里的每个元素都是null,直接调用courses[i].setName(...)会因为找不到具体的Course对象而报错。

修复方案

我们可以调整数组的初始化时机,比如在entercourse方法里根据cn的值来创建数组,同时在循环里先实例化Course对象:

public class GradeBook {
    Scanner r = new Scanner(System.in);
    private int cn;
    private Course courses[]; // 先声明数组,不初始化

    // 新增设置课程数量的方法,同时初始化数组
    public void setCourseNumber(int cn) {
        this.cn = cn;
        this.courses = new Course[cn];
    }

    void entercourse() {
        // 先检查数组是否已初始化,避免cn还没设置的情况
        if (courses == null || courses.length == 0) {
            System.out.println("请先设置课程数量!");
            return;
        }
        for (int i = 0; i < courses.length; i++) {
            // 先创建Course对象,再调用方法
            courses[i] = new Course(); 
            System.out.println("请输入课程名称:");
            courses[i].setName(r.nextLine());
            System.out.println("请输入课程分数:");
            courses[i].setMark(r.nextInt());
            // 关键:nextInt()会留下换行符,用nextLine()吃掉,避免下一次读取空内容
            r.nextLine();
            courses[i].setpass();
        }
    }
}

另外还要注意nextInt()和nextLine()的搭配问题:nextInt()只会读取数字,不会读取后面的换行符,所以下一次调用nextLine()会直接读取这个换行符,导致获取的课程名称为空,所以需要在nextInt()之后加一个r.nextLine()来消耗掉换行符。

内容的提问来源于stack exchange,提问作者Skill HHY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:57:37