【问题标题】:showing null pointer exception with junit test case使用junit测试用例显示空指针异常
【发布时间】:2012-08-29 12:51:44
【问题描述】:

我正在尝试使用 junit 测试用例根据薪水对员工对象进行排序。

这是我的员工排序类

package day4;
import day4.Employee;
public class EmployeesInfoWithSalary {
    private Employee[] employee;
    private int numberOfEmployees;
public EmployeesInfoWithSalary(Employee[] employee, int numberOfEmployees) {
    super();
    this.employee = employee;
    this.numberOfEmployees = numberOfEmployees;
}

public Employee[] getSortBasedOnSalary() {

    String temp;
    for (int iterator = 0; iterator < numberOfEmployees; iterator++) {
        int minSalary = employee[iterator].getSalary();
        int index = iterator;
        for (int comparator = iterator; comparator < numberOfEmployees; comparator++) {
            if (employee[comparator].getSalary() < minSalary) {
                index = comparator;
                minSalary = employee[comparator].getSalary();
            }

        }

        employee[index].setSalary(employee[iterator].getSalary());
        employee[iterator].setSalary(minSalary);
        temp = employee[index].getId();
        employee[index].setId(employee[iterator].getId());
        employee[iterator].setId(temp);
        temp = employee[index].getName();
        employee[index].setName(employee[iterator].getName());
        employee[iterator].setName(temp);

    }

    return employee;

}

}

员工对象类如下

package day4;

public class Employee {

private String id;
private String name;
private int salary;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getSalary() {
    return salary;
}

public void setSalary(int salary) {
    this.salary = salary;
}

}

junit测试用例的testemployee工资等级如下

package day4;

import static org.junit.Assert.*;
import day4.Employee;

import org.junit.Test;

public class TestEmployeeInfoWithSalary {

@Test
public void testGetSortBasedOnSalary() {

Employee[] employee = new Employee[5];

employee[0].setName("pratap");
employee[1].setName("aruna");
employee[2].setName("satyam");
employee[3].setName("krishna");
employee[4].setName("siva");

employee[0].setId("k0100");
employee[1].setId("k0101");
employee[2].setId("k0102");
employee[3].setId("k0103");
employee[4].setId("k0104");
employee[0].setSalary(10000);
employee[1].setSalary(1000);
employee[2].setSalary(8000);
employee[3].setSalary(6000);
employee[4].setSalary(9000);
EmployeesInfoWithSalary employeeInfoWithSalary= new EmployeesInfoWithSalary(employee, 5);

employee[4].setName("pratap");
employee[0].setName("aruna");
employee[2].setName("satyam");
employee[1].setName("krishna");
employee[3].setName("siva");

employee[4].setId("k0100");
employee[0].setId("k0101");
employee[2].setId("k0102");
employee[1].setId("k0103");
employee[3].setId("k0104");
employee[4].setSalary(10000);
employee[0].setSalary(1000);
employee[2].setSalary(8000);
employee[1].setSalary(6000);
employee[3].setSalary(9000);
assertArrayEquals(employee,employeeInfoWithSalary.getSortBasedOnSalary());

}

}

日志显示空点表达式的错误..

任何人都可以帮助我.. 谢谢..

【问题讨论】:

  • 你能提供一个堆栈跟踪吗?
  • 我建议您阅读 NullPointerException 以了解它发生的位置并使用您的调试器尝试调试代码以确定发生这种情况的原因。
  • 为什么不使用 ArrayList 而不是 Array 然后使用 Collections.sort() 并使用自定义比较器。我认为这会大大简化事情
  • 这是作业吗?不要使用数组,使用java.util.List (java.util.ArrayList)。如果您必须使用数组,则无需将数组中的一些元素传递给您的构造函数,因为数组对象上有一个长度字段(您可以从employee.length 中找到元素的数量)。
  • 你知道,如果你想对员工列表进行排序,你可以实现一个基于薪水工作的 compareTo 方法,然后使用 Arrays.sort(..)。

标签: java junit junit4


【解决方案1】:

我怀疑这是 NPE 的路线。

// creates an array full of null values.
Employee[] employee = new Employee[5];

employee[0].setName("pratap");

您需要将 Employee 对象添加到数组中的每个元素。

更好的方法是使用构造函数来获取所有需要的字段。

Employee[] employee = {
    new Employee("pratap", "k0100", 10000),
    new Employee("aruna",  "k0101",  1000),
    new Employee("satyam", "k0102",  8000),
    new Employee("krishna","k0103",  6000),
    new Employee("siva",   "k0104",  9000) };

【讨论】:

  • 我通过这样做得到了答案......Employee firstEmployee=new Employee(); firstEmployee.setName("pratap"); firstEmployee.setSalary(10000); firstEmployee.setId("k0100");雇员[0]=第一雇员; firstEmployee.setSalary(1000); firstEmployee.setId("k0101"); firstEmployee.setName("aruna");雇员[1]=firstEmployee;
  • 尝试在不同点打印System.out.println(Arrays.toString(employee)); 或在调试器中单步执行代码。这将使您能够看到正在发生的事情。
【解决方案2】:

之后

 Employee[] employee = new Employee[5];

对于数组中的每个索引,您需要初始化Employee 对象。

 employee[0] = new Employee(); etc

【讨论】:

    猜你喜欢
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    相关资源
    最近更新 更多