Java跨方法展示while循环录入数组遇null问题及列对齐实现
学生信息管理程序问题修复方案
问题1:数组展示出现null值的修复
原因分析
- 类中定义的静态变量
subj是单个String类型,unit是单个int类型,无法存储多个科目/学分; academicinfo()和academicunit()方法中重新定义了局部数组变量,覆盖了类的静态变量,导致静态变量未被赋值,最终展示时输出null和默认值0。
修复步骤
- 修正静态变量类型:将类中的静态变量修改为数组类型:
static String lname, fname, mname, program; static String[] subj; // 改为字符串数组存储多个科目 static int studentno; static int[] unit; // 改为int数组存储多个学分
- 移除方法内的局部数组定义:在
academicinfo()和academicunit()中,直接初始化类的静态数组,不再定义局部变量:
// academicinfo()修改后 static void academicinfo() { Scanner sc = new Scanner(System.in); subj = new String[8]; // 初始化静态科目数组 System.out.print("Program: "); program = sc.nextLine(); System.out.println("Courses: "); int i = 0; while (i < subj.length) { subj[i] = sc.nextLine(); i++; } } // academicunit()修改后 static void academicunit() { Scanner sc = new Scanner(System.in); unit = new int[8]; // 初始化静态学分数组 System.out.println("Units in corresponding order"); int i = 0; while (i < unit.length) { unit[i] = sc.nextInt(); i++; } sc.nextLine(); // 处理输入int后的换行符,避免后续输入异常 }
问题2:实现科目与学分列对齐
实现方式
使用System.out.printf()格式化输出,通过指定字符串宽度实现列对齐。%-30s表示左对齐、占30个字符宽度,%d用于输出整数学分。
修改finaloutput()方法
static void finaloutput() { System.out.println("PERSONAL INFORMATION"); System.out.println("\tStudent No. " + studentno); System.out.println("\tLast Name: " + lname); System.out.println("\tFirst Name: " + fname); System.out.println("\tMiddle Name: " + mname); System.out.println("\nACADEMIC INFORMATION"); System.out.println("Program: " + program); // 格式化输出表头和内容 System.out.printf("%-30s %s%n", "Courses:", "Units:"); for (int i = 0; i < subj.length; i++) { // 处理未输入的科目(避免null显示) String course = subj[i] == null ? "" : subj[i]; System.out.printf("%-30s %d%n", course, unit[i]); } }
修改后的完整代码
package com.mycompany.studentinfo; import java.util.Scanner; public class StudentInfo { static String lname, fname, mname, program; static String[] subj; static int studentno; static int[] unit; public static void main(String[] args){ student(); academicinfo(); academicunit(); finaloutput(); } static void student() { try { System.out.println("***PROVIDE THE FOLLOWING***"); Scanner sc = new Scanner(System.in); System.out.print("Student No: "); studentno = sc.nextInt(); String xd = sc.nextLine(); // 处理nextInt后的换行符 System.out.print("Last Name: "); lname = sc.nextLine(); System.out.print("First Name: "); fname = sc.nextLine(); System.out.print("Middle Name: "); mname = sc.nextLine(); } catch (Exception x){ System.out.println("***ERROR***"); student(); } } static void academicinfo() { Scanner sc = new Scanner(System.in); subj = new String[8]; System.out.print("Program: "); program = sc.nextLine(); System.out.println("Courses: "); int i = 0; while (i < subj.length) { subj[i] = sc.nextLine(); i++; } } static void academicunit() { Scanner sc = new Scanner(System.in); unit = new int[8]; System.out.println("Units in corresponding order"); int i = 0; while (i < unit.length) { unit[i] = sc.nextInt(); i++; } sc.nextLine(); } static void finaloutput() { System.out.println("PERSONAL INFORMATION"); System.out.println("\tStudent No. " + studentno); System.out.println("\tLast Name: " + lname); System.out.println("\tFirst Name: " + fname); System.out.println("\tMiddle Name: " + mname); System.out.println("\nACADEMIC INFORMATION"); System.out.println("Program: " + program); System.out.printf("%-30s %s%n", "Courses:", "Units:"); for (int i = 0; i < subj.length; i++) { String course = subj[i] == null ? "" : subj[i]; System.out.printf("%-30s %d%n", course, unit[i]); } } }
内容的提问来源于stack exchange,提问作者myNameShu
相关产品推荐
相关产品推荐

