- 问题:用一个定长数组存放学生信息,并且能输出学生信息
- 注意:如果定长数组没存满,遍历的时候就会出现空指针异常,如何避免呢?
- 解决办法:控制循环条件,不完全遍历,只遍历值不为空的情况,添加数据的时候,记录添加次数,作为循环遍历的次数
- 代码如下:
- ***********************工人类************************
- package com.xtkj.javaProgram;
- import java.util.Scanner;
- public class Worker {
- private int id;
- private String name;
- private int age;
- private double salary;
- Worker(){
- this.id = id;
- this.name = name;
- this.age = age;
- this.salary = salary;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public double getSalary() {
- return salary;
- }
- public void setSalary(double salary) {
- this.salary = salary;
- }
- }
- ********************************方法类******************************
- package com.xtkj.javaProgram;
- import java.util.Scanner;
- public class Do {
- Worker []a=new Worker[50];// 定义一个Worker类型的数组,长度为50
- int i=0;//在方法外部 定义一个变量,记录添加的次数
- int notexist=0;
- Scanner sc=new Scanner(System.in );
- //添加
- void add(){
- System.out.println("请输入新员工的员工号、姓名、年龄和工资:");
- Worker wr=new Worker();
- a[i]=wr;//每一次添加都实例化一个对象,并以把对象存入到数组a中
- int id=sc.nextInt();
- a[i].setId(id);
- String name=sc.next();
- a[i].setName(name);
- int age=sc.nextInt();
- a[i].setAge(age);
- double salary=sc.nextDouble();
- a[i].setSalary(salary);
- System.out.println("**********添加成功***********");
- i++;//做标记,记录数组下标
- }
- //按员工号查询
- void find(){
- System.out.println("请输入员工的员工号:");
- int id=sc.nextInt();
- for(int j=0;j<i;j++){
- if(a[j].getId()==id){
- System.out.println("所查员工信息为:");
- System.out.println("员工号:"+a[j].getId()+" 姓名:"+a[j].getName()
- +" 年龄:"+a[j].getAge()+" 工资"+a[j].getSalary());
- notexist=1;
- }
- }
- if(notexist!=1){
- System.out.println("查无此人");
- }
- }
- //显示所有员工信息
- void showAll(){
- System.out.println("员工的员工号、姓名、年龄和工资如下:");
- for(int j=0;j<i;j++){//循环次数以数组啊[i]de 下标为准,不是数组长度,否则会空指针异常
- System.out.println("员工号:"+a[j].getId()+" 姓名:"+a[j].getName()
- +" 年龄:"+a[j].getAge()+" 工资"+a[j].getSalary());
- }
- }
- //修改薪水
- void updatesal(){
- System.out.println("请输入要修改的员工的员工号和修改之后的工资:");
- int id=sc.nextInt();
- double salary=sc.nextDouble();
- for(int j=0;j<i;j++){
- if(a[j].getId()==id){
- System.out.println("该员工信息为:");
- System.out.println("员工号:"+a[j].getId()+" 姓名:"+a[j].getName()
- +" 年龄:"+a[j].getAge()+" 工资"+a[j].getSalary());
- notexist=1;
- a[j].setSalary(salary);
- System.out.println("修改后员工信息为:");
- System.out.println("员工号:"+a[j].getId()+" 姓名:"+a[j].getName()
- +" 年龄:"+a[j].getAge()+" 工资"+a[j].getSalary());
- }
- }
- if(notexist!=1){
- System.out.println("查无此人");
- }
- System.out.println("******************************修改成功!*******************************");
- }
- *****************************主类************************************************************
- public class Main {
- public static void main(String[] args) {
- Do d=new Do();
- boolean b=true;
- while(b){//通过while循环,控制循环条件一直为true,每次switch语句跳出后,都立刻回到主菜单
- System.out.println("*********************欢迎进入职员薪水管理系统***********************");
- System.out.println("请选择以下操作:");
- System.out.println("1.添加新员工");
- System.out.println("2.查询员工信息");
- System.out.println("3.显示所有员工信息");
- System.out.println("4.修改员工薪水");
- Scanner reader=new Scanner(System.in );
- int choice=reader.nextInt();
- switch(choice){
- case 1:
- d.add();
- break;
- case 2:{
- d.find();
- }
- break;
- case 3:
- d.showAll();
- break;
- case 4:
- d.updatesal();
- break;
- default:{
- System.out.println("您的输入有误,请从新输入:");
- }
- }
- }
- }
- }