Java打印Lesson对象输出类名@哈希值串的原因及解决方法
异常输出含义
week23.UniversityProblem.Lesson@77459877是Java对象默认的字符串表示形式:所有Java类都默认继承顶层Object类,当你直接打印对象时,会自动调用Object类自带的toString()方法,返回值格式固定为类的全路径名@对象哈希码的十六进制表示。
出现该输出的核心原因是你没有为Lesson类自定义字符串转换规则,程序不会自动读取类里的name、credit属性拼接成可读文本。
修复方法
核心修改是为Lesson类重写toString()方法,自定义对象打印时的输出内容,同时可以顺带修复现有代码里的Scanner输入逻辑bug。
1. 修改Lesson类,添加toString()重写
你原来的Lesson类里多余导入了ArrayList类,可以直接删除,修改后的完整Lesson类代码如下:
package week23.UniversityProblem; public class Lesson { String name; int credit; @Override public String toString() { return "课程名:" + name + ",学分:" + credit; } }
重写方法后,你原有循环打印选课信息的代码不需要改动,打印Lesson实例时会自动输出你定义的可读内容,不再返回内存地址格式的字符串。
2. (可选优化)修复输入逻辑bug
你当前代码创建了两个Scanner对象同时绑定标准输入流,且调用nextInt()读取菜单选项后,没有处理输入流中残留的换行符,会导致读取学生姓名时直接读到空值。可以删除多余的scanner2实例,统一使用一个Scanner对象,在每次调用nextInt()后补一次nextLine()消费残留换行即可。
修改后的主方法输入部分示例:
// 仅保留一个Scanner实例 Scanner scanner = new Scanner(System.in); int o = 0; while (o != 2){ System.out.println("请选择要使用的功能:"); System.out.println("1. 添加学生并打印选课信息"); System.out.println("2. 退出"); o = scanner.nextInt(); scanner.nextLine(); // 消费整数读取后残留的换行符 if(o == 1){ Student s = new Student(); System.out.println("姓名:"); s.name = scanner.nextLine(); int c = 0; int o2 = 0; while(c < s.maxCredit){ System.out.println("请选择要选修的课程:"); System.out.println("1. " + math101.name); System.out.println("2. " + phys101.name); System.out.println("3. " + cs102.name); System.out.println("4. " + ictapp.name); System.out.println("5. " + rs101.name); System.out.println("6. 退出选课"); o2 = scanner.nextInt(); // 其余选课判断逻辑保持不变即可
修改完成后运行程序,输出效果如下,符合预期:
Tudor 课程名:Mathematics,学分:4 课程名:Physics,学分:3
内容的提问来源于stack exchange,提问作者Computerdude123
相关产品推荐
相关产品推荐

