Java:为什么没有null时会出现NullPointerException?

时间:2017-10-01 05:37:21

标签: java nullpointerexception

这是我第一次使用这个网站,所以希望这是有道理的。我有下面的代码,当我执行它时,它在我的Library类的第38行给我一个NullPointerException,

(该行说明 if(items [i] .getTitle()!= null&& items [i] .getTitle()。equals(title)){

和我的MainMethod类中的29上的另一个NullPointerException,

(行是 if(loaned == true){)。

要检查items [i]的内容,在我添加了一个我在控制台中打印的项目,看它是否为空并且它已成功打印,所以我很困惑为什么NullPointerExpcetion存在。任何和所有帮助将不胜感激。

公共类MediaItem {

private String title;
private String format;
public boolean onLoan;
public String loanedTo;
public String dateLoaned;

MediaItem() {
    onLoan = false;
    loanedTo = null;
    dateLoaned = null;
    title = null;
    format = null;
}

MediaItem(String title, String format) {
    this.title = title;
    this.format = format;
}

public String getTitle() {
    return this.title;
}

public String setFormat(String format) {
    this.format = format;
    return this.format;
}

public String getFormat() {
    return format;
}

void markOnLoan(String name, String date) {
    if (onLoan == true) {
        System.out.println(title + " is already on loan to " + loanedTo);
    } else {
        onLoan = true;
        loanedTo = name;
        dateLoaned = date;
    }
}

void markReturned() {

}

}

import java.util.Scanner;

公共类库{

int numberOfItems = 0;
MediaItem[] items = new MediaItem[100];

int displayMenu() {
    Scanner s = new Scanner(System.in);
    System.out.println(
            "1. Add an item \n2. Mark an item as on loan \n3. List all items \n4. Mark an item as returned \n5. Quit \n\nWhat would you like to do?");
    int choice = s.nextInt();
    return choice;
}

void addNewItem(String title, String format) {
    items[numberOfItems] = new MediaItem(title, format);

    numberOfItems++;

}

void markItemOnLoan(String title, String name, String date) {
    for (int i = 0; i <= 100; i++) {
        if (items[i].getTitle() == title) {
            items[i].onLoan = true;
            items[i].loanedTo = name;
            items[i].dateLoaned = date;
        }
    }

}

boolean checkIfLoaned(String title) {
    char loaned = 'N';
    System.out.println(items[0].getTitle());
    for (int i = 0; i < 100; i++) {
        if (items[i].getTitle() != null && items[i].getTitle().equals(title)) {
            if (items[i].onLoan) {
                String personName = items[i].loanedTo;
                System.out.println(title + " is already on loan to " + personName);
                loaned = 'Y';
            }
        }

    }
    if (loaned == 'Y') {
        return true;
    } else {
        return false;
    }
}

}

import java.util.Scanner;

公共类MainMethod {

public static void main(String[] args) {
    int choice = 1;
    String personName;
    String mediaName;
    String format;
    String loanDate;
    Scanner s = new Scanner(System.in);
    Library l = new Library();

    while (choice != 5) {
        choice = l.displayMenu();
        switch (choice) {
        case 1:
            System.out.println("What is the title?");
            mediaName = s.nextLine();
            System.out.println("What is the format?");
            format = s.nextLine();
            l.addNewItem(mediaName, format);
            break;
        case 2:
            System.out.println("Which item (enter the title)?");
            mediaName = s.nextLine();
            System.out.println("Who are you loaning it to?");
            personName = s.nextLine();
            boolean loaned = l.checkIfLoaned(mediaName);

            if (loaned == true) {
                break;
            }
            System.out.println("When did you loan the item?");
            loanDate = s.nextLine();
            l.markItemOnLoan(mediaName, personName, loanDate);
        }

    }
}

}

3 个答案:

答案 0 :(得分:0)

如果你也发布了callstack会更好。我能看到的3个潜在错误是:

  1. items [i]可能为null。虽然您正在检查项目[X] .getTitle()上的空值...您不会对项目执行空检查[i]

  2. 你的for循环从0到100.是否可以填充0-99索引中数组中的所有元素?你不应该从0到items.length?

  3. 您的数组是针对100个元素定义的。您正尝试访问for循环中的第101个元素(i<=100)应为i < 100

答案 1 :(得分:0)

我假设这是作业,所以我会引导你朝着正确的方向前进,而不是发布代码。

  1. 您正在迭代markItemOnLoancheckIfLoaned中100个项目的硬编码值。仅仅因为你声明了一个包含100个项目的数组,并不意味着它们都被初始化了。考虑更改循环以迭代numberOfItems而不是100。您还应该addNewItem进行检查,以确保您不会超过100项。
  2. 与#1相关,您不检查从阵列中提取的实际项目是否为null,因此您尝试在空对象上调用方法getTitle,自然会抛出NPE。
  3. 旁注,在markItemOnLoan中,您错误地比较了字符串。您在checkIfLoaned中比较标题的方式是正确的。

答案 2 :(得分:0)

  

为什么没有null时会出现NullPointerException?

不可能发生。

由此我们推断null 。这很简单。

如果您要成功调试程序绝不否认证据告诉您的内容。

那么null在哪里?

 if (items[i].getTitle() != null && items[i].getTitle().equals(title)) { 

仅基于这一行,有四种可能的解释:

  1. items为空
  2. items[i]为空
  3. 另一个线程正在改变一些事情......你运气不好。
  4. getTitle()方法每次返回的内容不是String或不同String
  5. 我们可以通过阅读代码消除第一和第四种解释,第三种解释极不可能(甚至假设它是可能的)。

    这使得第二种解释成为“工作假设”。