【问题标题】:Getting a Null Pointer Exception and not sure how to fix it [duplicate]获得空指针异常并且不确定如何修复它[重复]
【发布时间】:2014-06-18 05:35:56
【问题描述】:

我正在为一个简单的输入数据库程序创建一个测试器类。我不必存储信息也不必删除任何内容,但我正在为其运行测试器类的类中有两个数组。

这是我的测试类:

import java.util.Scanner;

public class Asst_3 {

    private static Scanner keyboard;

    public Asst_3(){

        this.keyboard = new Scanner(System.in);
    }

    public static void main(String[]args){

        Policy insurance = new Policy();

        insurance.setCustomerLast(null);
        insurance.setCustomerFirst(null);
        insurance.setPolicyNumber();
        insurance.setAge();
        insurance.setAccidentNumber();
        insurance.setPremiumDueDate(00,00,0000);
        //insurance.toString();

        System.out.println("Welcome to Drive-Rite Insurance Company");
        showMenuOptions();

        Scanner keyboard = new Scanner(System.in);
        int choice = keyboard.nextInt();
        intiateMenuSelection(choice);
    }

    private static void intiateMenuSelection(int selectedOption) {
        switch (selectedOption){
        case 1: newPolicy(null);
            break;
        case 2: returnFromAge();
            break;
        case 3: returnFromDue();
            break;
        case 4: System.out.println("Goodbye");
                System.exit(0);
            break;
        default: break;
        }
    }

    private static void newPolicy(Policy insurance) {
        System.out.println("Enter Customer's Policy Number: ");
        int poliNum = keyboard.nextInt();
        insurance.getPolicyNumber();
        System.out.println("Customer's Policy Number is: " + keyboard.nextInt());

        System.out.println("Enter Customer's Last Name: ");
        String custLast = keyboard.nextLine();
        insurance.getCustomerLast();
        System.out.println("Customer's Last Name is: " + keyboard.nextInt());

        System.out.println("Enter Customer's First Name: ");
        String custFirst = keyboard.nextLine();
        insurance.getCustomerFirst();
        System.out.println("Customer's First Name is: " + keyboard.nextInt());

        System.out.println("Enter Customer's Age: ");
        int custAge = keyboard.nextInt();
        insurance.getAge();
        System.out.println("Customer's Age is: " + keyboard.nextInt());

        System.out.println("Enter Customer's Amount of Previous Accident Reaports in Past 3 years: ");
        int custAccident = keyboard.nextInt();
        insurance.getAccidentNumber();
        System.out.println("Customer's Amount of Accidents is: " + keyboard.nextInt());

        System.out.println("Enter Customer's next Premium Due Date: ");
        int dueDate = keyboard.nextInt();
        insurance.getPremiumDueDate();
        System.out.println("Customer's Next Due Date is: " + keyboard.nextInt());

        insurance.toString();

        showMenuOptions();
    }

    private static void returnFromDue() {

        showMenuOptions();
    }

    private static void returnFromAge() {

        showMenuOptions();
    }

    private static void returnToMenu() {

        intiateMenuSelection(0);
    }

    private static void showMenuOptions() {

        System.out.println("Choose a menu option: ");
        System.out.println("(1) Create New Policies");
        System.out.println("(2) Search by age");
        System.out.println("(3) Search by due date");
        System.out.println("(4) Exit");
        System.out.print("Input Option Number ---> ");
    }

}

还有空指针错误:

Exception in thread "main" java.lang.NullPointerException
  at Asst_3.newPolicy(Asst_3.java:55)
  at Asst_3.intiateMenuSelection(Asst_3.java:40)
  at Asst_3.main(Asst_3.java:35)

这是我正在为其制作测试器的课程:

import java.util.*;

public class Policy {

    private int policyNumber;
    private int age;
    private int accidentNumber;
    private String customerLast;
    private String customerFirst;
    private int [] months;
    private int [] premiumDueDate;

    public Policy() {

        this.policyNumber = 0;
        this.age = 0;
        this.accidentNumber = 0;
        this.customerLast = "";
        this.customerFirst = "";
        this.premiumDueDate = new int [3];
        this.premiumDueDate[0] = 0;
        this.premiumDueDate[1] = 0;
        this.premiumDueDate[2] = 0;
        this.months = new int [12];
        this.months[0] = this.months[2] = this.months[4] = this.months[6] = this.months[7] = this.months[9] = this.months[11] = 31;
        this.months[1] = 28;
        this.months[3] = this.months[5] = this.months[8] = this.months[10] = 30;
    }

    public int getPolicyNumber(){
        return this.policyNumber;
    }

    public void setPolicyNumber(){
        if(policyNumber < 1000){
            policyNumber = 0;
        }
        if(policyNumber > 9999){
            policyNumber = 0;
        }
    }

    public int[] getPremiumDueDate(){
        return this.premiumDueDate;
    }

    public void setPremiumDueDate(int month, int day, int year){
        this.premiumDueDate[0] = month;
        this.premiumDueDate[1] = day;
        this.premiumDueDate[2] = year;

        if(month < 0||month >= 12)
        {
            this.premiumDueDate[0] = 0;
            this.premiumDueDate[1] = 0;
            this.premiumDueDate[2] = 0;
        }
        else if(day < 0 || day > this.months[month])
        {
            this.premiumDueDate[0] = 0;
            this.premiumDueDate[1] = 0;
            this.premiumDueDate[2] = 0;
        }
    }

    public int getAge(){
        return this.age;
    }

    public void setAge(){
        this.age = 0;
    }

    public int getAccidentNumber(){
        return this.accidentNumber;
    }

    public void setAccidentNumber(){
        this.accidentNumber = 0;
    }

    public String getCustomerLast(){
        return this.customerLast;
    }

    public void setCustomerLast(String customerLast){
        this.customerLast = customerLast;
    }

    public String getCustomerFirst(){
        return this.customerFirst;
    }

    public void setCustomerFirst(String customerFirst){
        this.customerFirst = customerFirst;
    }

    public String toString(){
        return "\n Policy Number: " + this.policyNumber + "\n Customer Last Name: " + this.customerLast + "\n Customer First Name: " + this.customerFirst 
            + "\n Customer age: " + this.age + "\n Number of Accidents in Past Three Years: " + this.accidentNumber + "\n Premium Due Date: " + this.premiumDueDate;
    }

}

谢谢大家,你们太棒了!

这是我编辑的代码:

测试者

import java.util.Scanner;

public class Asst_3 {

private static Scanner keyboard;

public Asst_3(){

    this.keyboard = new Scanner(System.in);
}

public static void main(String[]args){

    System.out.println("Welcome to Drive-Rite Insurance Company");
    showMenuOptions();

    int choice = keyboard.nextInt();
    intiateMenuSelection(choice);
}

private static void intiateMenuSelection(int selectedOption) {
    switch (selectedOption){
    case 1: newPolicy(new Policy());
        break;
    case 2: returnFromAge();
        break;
    case 3: returnFromDue();
        break;
    case 4: System.out.println("Goodbye");
            System.exit(0);
        break;
    default: break;
    }
}

private static void newPolicy(Policy insurance) {
    System.out.println("Enter Customer's Policy Number: ");
    int poliNum = keyboard.nextInt();
    insurance.setPolicyNumber(poliNum);
    System.out.println("Customer's Policy Number is: " + insurance.getPolicyNumber());

    System.out.println("Enter Customer's Last Name: ");
    String custLast = keyboard.nextLine();
    insurance.setCustomerLast(custLast);
    System.out.println("Customer's Last Name is: " + insurance.getCustomerLast());

    System.out.println("Enter Customer's First Name: ");
    String custFirst = keyboard.nextLine();
    insurance.setCustomerFirst(custFirst);
    System.out.println("Customer's First Name is: " + insurance.getCustomerFirst());

    System.out.println("Enter Customer's Age: ");
    int custAge = keyboard.nextInt();
    insurance.setAge(custAge);
    System.out.println("Customer's Age is: " + insurance.getAge());

    System.out.println("Enter Customer's Amount of Previous Accident Reaports in Past 3 years: ");
    int custAccident = keyboard.nextInt();
    insurance.setAccidentNumber(custAccident);
    System.out.println("Customer's Amount of Accidents is: " + insurance.getAccidentNumber());

    System.out.println("Enter Customer's next Premium Due Date: ");
    int dueDate = keyboard.nextInt();
    insurance.setPremiumDueDate(dueDate, dueDate, dueDate);
    System.out.println("Customer's Next Due Date is: " + insurance.getPremiumDueDate());

    insurance.toString();

    returnToMenu();
}

private static void returnFromDue() {

    showMenuOptions();
}

private static void returnFromAge() {

    showMenuOptions();
}

private static void returnToMenu() {

    intiateMenuSelection(0);
}

private static void showMenuOptions() {

    System.out.println("Choose a menu option: ");
    System.out.println("(1) Create New Policies");
    System.out.println("(2) Search by age");
    System.out.println("(3) Search by due date");
    System.out.println("(4) Exit");
    System.out.print("Input Option Number ---> ");
}

}

以及被测试的类:

import java.util.*;

public class Policy {

private int policyNumber;
private int age;
private int accidentNumber;
private String customerLast;
private String customerFirst;
private int [] months;
private int [] premiumDueDate;

public Policy() {

    this.policyNumber = 0;
    this.age = 0;
    this.accidentNumber = 0;
    this.customerLast = "";
    this.customerFirst = "";
    this.premiumDueDate = new int [3];
    this.premiumDueDate[0] = 0;
    this.premiumDueDate[1] = 0;
    this.premiumDueDate[2] = 0;
    this.months = new int [12];
    this.months[0] = this.months[2] = this.months[4] = this.months[6] = this.months[7] = this.months[9] = this.months[11] = 31;
    this.months[1] = 28;
    this.months[3] = this.months[5] = this.months[8] = this.months[10] = 30;
}

public int getPolicyNumber(){
    return this.policyNumber;
}

public void setPolicyNumber(int policyNumber){
    if(policyNumber < 1000){
        policyNumber = 0;
    }
    if(policyNumber > 9999){
        policyNumber = 0;
    }
}

public int[] getPremiumDueDate(){
    return this.premiumDueDate;
}

public void setPremiumDueDate(int month, int day, int year){
    this.premiumDueDate[0] = month;
    this.premiumDueDate[1] = day;
    this.premiumDueDate[2] = year;

    if(month < 0||month >= 12)
    {
        this.premiumDueDate[0] = 0;
        this.premiumDueDate[1] = 0;
        this.premiumDueDate[2] = 0;
    }
    else if(day < 0 || day > this.months[month])
    {
        this.premiumDueDate[0] = 0;
        this.premiumDueDate[1] = 0;
        this.premiumDueDate[2] = 0;
    }
}

public int getAge(){
    return this.age;
}

public void setAge(int age){
    this.age = 0;
}

public int getAccidentNumber(){
    return this.accidentNumber;
}

public void setAccidentNumber(int accidentNumber){
    this.accidentNumber = 0;
}

public String getCustomerLast(){
    return this.customerLast;
}

public void setCustomerLast(String customerLast){
    this.customerLast = customerLast;
}

public String getCustomerFirst(){
    return this.customerFirst;
}

public void setCustomerFirst(String customerFirst){
    this.customerFirst = customerFirst;
}

public String toString(){
    return "\n Policy Number: " + this.policyNumber + "\n Customer Last Name: " + this.customerLast + "\n Customer First Name: " + this.customerFirst 
        + "\n Customer age: " + this.age + "\n Number of Accidents in Past Three Years: " + this.accidentNumber + "\n Premium Due Date: " + this.premiumDueDate;
}

}

但是现在执行程序后又出现了新的错误:

Welcome to Drive-Rite Insurance Company
Choose a menu option: 
(1) Create New Policies
(2) Search by age
(3) Search by due date
(4) Exit
Input Option Number ---> Exception in thread "main" java.lang.NullPointerException
    at Asst_3.main(Asst_3.java:23)

这是修复了该 NPE 的更新版本:

    import java.util.Scanner;

    public class Asst_3 {

private static Scanner keyboard;

public static void main(String[]args){

    System.out.println("Welcome to Drive-Rite Insurance Company");
    showMenuOptions();


    this.keyboard = new Scanner(System.in);

    int choice = keyboard.nextInt();
    intiateMenuSelection(choice);
}

private static void intiateMenuSelection(int selectedOption) {
    switch (selectedOption){

    case 1: newPolicy(new Policy());
        break;

    case 2: returnFromAge();
        break;

    case 3: returnFromDue();
        break;

    case 4: System.out.println("Goodbye");
            System.exit(0);
        break;

    default: break;
    }
}

private static void newPolicy(Policy insurance) {
    System.out.println("Enter Customer's Policy Number: ");
    int poliNum = keyboard.nextInt();
    insurance.setPolicyNumber(poliNum);
    System.out.println("Customer's Policy Number is: " + insurance.getPolicyNumber());

    System.out.println("Enter Customer's Last Name: ");
    String custLast = keyboard.nextLine();
    insurance.setCustomerLast(custLast);
    System.out.println("Customer's Last Name is: " + insurance.getCustomerLast());

    System.out.println("Enter Customer's First Name: ");
    String custFirst = keyboard.nextLine();
    insurance.setCustomerFirst(custFirst);
    System.out.println("Customer's First Name is: " + insurance.getCustomerFirst());

    System.out.println("Enter Customer's Age: ");
    int custAge = keyboard.nextInt();
    insurance.setAge(custAge);
    System.out.println("Customer's Age is: " + insurance.getAge());

    System.out.println("Enter Customer's Amount of Previous Accident Reaports in Past 3 years: ");
    int custAccident = keyboard.nextInt();
    insurance.setAccidentNumber(custAccident);
    System.out.println("Customer's Amount of Accidents is: " + insurance.getAccidentNumber());

    System.out.println("Enter Customer's next Premium Due Date: ");
    int dueDate = keyboard.nextInt();
    insurance.setPremiumDueDate(dueDate, dueDate, dueDate);
    System.out.println("Customer's Next Due Date is: " + insurance.getPremiumDueDate());

    insurance.toString();

    returnToMenu();
}

private static void returnFromDue() {

    showMenuOptions();
}

private static void returnFromAge() {

    showMenuOptions();
}

private static void returnToMenu() {

    intiateMenuSelection(0);
}

private static void showMenuOptions() {

    System.out.println("Choose a menu option: ");
    System.out.println("----------------------------------------");
    System.out.println("(1) Create New Policies");
    System.out.println("(2) Search by age");
    System.out.println("(3) Search by due date");
    System.out.println("(4) Exit");
    System.out.print("Input Option Number ---> ");
}

}

错误是我的键盘变量有问题。

【问题讨论】:

    标签: java arrays nullpointerexception


    【解决方案1】:

    空指针出现在

    private static void newPolicy(Policy insurance) 
    

    这种方法。对于这些行

    insurance.getPolicyNumber();
    
    insurance.get....();
    
    insurance.get....();
    

    因为引用/对象insurance 作为参数来自它被调用的地方。在您的情况下,您将 null 传递给方法

    newPolicy(null); //try to pass a reference of Policy  like  'newPolicy(new Policy())' .
    

    【讨论】:

    • 比如:newPolicy(get.PolicyNumber, etc) 而不是输入 null?
    • 没有。它应该像 newPolicy(new Policy()) 而不是给 null; @user3751018
    • 好吧,修复了那个错误,但现在我在用户必须输入他们的选项的地方有一个 NPE:Welcome to Drive-Rite Insurance CompanyChoose a menu option:(1) Create New Policies(1) Create New Policies(2) Search by age(3) Search by due date(4) Exit@ 987654332@java.lang.NullPointerException at Asst_3.main(Asst_3.java:33)`
    • 我猜不出这个问题。需要您在问题中给出的完整错误日志。顺便说一句,如果问题解决了,您可以在所有答案中将有用的答案标记为“接受”。 @user3751018
    • 另外你必须从@Jens 说的Scanner keyboard = new Scanner(System.in); 中删除Scanner 关键字。
    【解决方案2】:

    你声明了两次键盘。

    从该行中删除Scanner

    Scanner keyboard = new Scanner(System.in);
    

    所以你有:

    keyboard = new Scanner(System.in);
    

    【讨论】:

      【解决方案3】:

      您正在隐藏变量,也就是说,您已将 keyboard 声明为类变量

      public class Asst_3 {
      
          private static Scanner keyboard;
      

      但在main 中,您已将其重新声明为局部变量...

      Scanner keyboard = new Scanner(System.in);
      

      这意味着当你调用newPolicy时,类变量仍然是null

      从删除重新声明开始...

      //Scanner keyboard = new Scanner(System.in);
      keyboard = new Scanner(System.in);
      

      接下来会在NullPointerExceptionnewPolicy 中让你大吃一惊

      insurance.getPolicyNumber();
      

      由于您调用传递null 值的方法...

      newPolicy(null);
      

      我会让你解决这个问题;)

      提示: newPolicy 应该不带任何参数,并且应该返回一个新的 Policy 实例,然后可以通过其他方法对其进行操作;)

      【讨论】:

        【解决方案4】:

        您传递给newPolicyinsurance 为空

        case 1: newPolicy(null);
        

        因此

        insurance.getPolicyNumber();
        

        会抛出一个 NPE

        【讨论】:

          猜你喜欢
          • 2019-03-07
          • 2023-03-15
          • 1970-01-01
          • 1970-01-01
          • 2014-02-04
          • 1970-01-01
          相关资源
          最近更新 更多