【问题标题】:Why throwing exception is not working when parameter is null?为什么当参数为空时抛出异常不起作用?
【发布时间】:2020-09-30 06:05:33
【问题描述】:

我创建了一个从 HashMAP 中删除学生的方法。当 id 为空时,它应该抛出异常。有人知道为什么它不起作用吗?

public void deleteStudent(String firstName, String lastName, String phoneNumber, String birthDate, PersonGender gender, String id)  {
        Student student = new Student(firstName, lastName, phoneNumber, birthDate, gender, id);

        if (students.containsKey(id)) {
            students.remove(id);
        }
        if (students.containsKey(id == null)) {
              throw new NullPointerException("The student does not exist");
        }
    }

公共类应用程序{ public static void main(String[] args) {

    StudentRepository myStudent = new StudentRepository();
    myStudent.addStudent("St","Rt","0742", "1993.03.04", PersonGender.MALE, "1930303");
    myStudent.addStudent("Sr","Ro","0742", "1994.03.04", PersonGender.MALE, "1940304");
    myStudent.addStudent("Se","Rb","0742", "1995.03.04", PersonGender.MALE, "1950305");
    myStudent.addStudent("Sm","Re","0742", "1996.03.04", PersonGender.MALE, "1950306");
    myStudent.deleteStudent("Str","Rob","0742", "1992.03.04", PersonGender.MALE, "null");
    myStudent.addStudent("Sr","Ro","0742", "1994.03.04", PersonGender.MALE, "1940304");
    myStudent.displayStudents();


}

}

【问题讨论】:

  • 不就是if (id == null) { throw new .... } 吗?
  • 而且您似乎希望尝试使用id之前。
  • 它具有相同的行为,没有抛出异常
  • 1) 请在创建/读取students 的位置添加代码,目前无法理解该变量中的内容。 2)containsKey(id == null)其实和containsKey(True)是一样的,如果students只是一组id,可以换成containsKey(null)
  • 我添加了你要求的内容

标签: java


【解决方案1】:

试试:

public void deleteStudent(String firstName, String lastName, String phoneNumber, String birthDate, PersonGender gender, String id)  {
        Student student = new Student(firstName, lastName, phoneNumber, birthDate, gender, id);

        if (id == null) {
              throw new NullPointerException("ID is null");
        }

        if (students.containsKey(id)) {
            students.remove(id);
        }
        else {
            throw new NullPointerException("The student does not exist");
        }

    }

注意:

  1. 假设如果students 不包含键,则抛出异常。因此添加了else 声明。
  2. 此外,检查最初通过了id。如果找不到,则抛出异常。您可以根据自己的需要进行修改。

【讨论】:

  • 可怕的建议!为什么要为失踪的学生抛出 NPE?对于 null 引用,应严格抛出 NPE。您应该建议创建一个自定义业务异常并抛出相同的异常,而不是滥用 NPE。
  • @ArvindKumarAvinash 你是对的。我们可以用上面的代码做很多事情。然而 Motive 是为了解决问题并引导用户按照他/她的书面代码继续前进
【解决方案2】:

使用前应检查输入参数的正确性。这遵循典型的guard pattern

my_function(some params) {
  if (precondition not met) { //the guard
    error handling;
  }
  business logic;
}

【讨论】: