无法在另一个类中设置值:设置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
相关产品推荐
相关产品推荐

