这是我第一次使用这个网站,所以希望这是有道理的。我有下面的代码,当我执行它时,它在我的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);
}
}
}
}
答案 0 :(得分:0)
如果你也发布了callstack会更好。我能看到的3个潜在错误是:
items [i]可能为null。虽然您正在检查项目[X] .getTitle()上的空值...您不会对项目执行空检查[i]
你的for循环从0到100.是否可以填充0-99索引中数组中的所有元素?你不应该从0到items.length?
您的数组是针对100个元素定义的。您正尝试访问for循环中的第101个元素(i<=100)
应为i < 100
。
答案 1 :(得分:0)
我假设这是作业,所以我会引导你朝着正确的方向前进,而不是发布代码。
markItemOnLoan
和checkIfLoaned
中100个项目的硬编码值。仅仅因为你声明了一个包含100个项目的数组,并不意味着它们都被初始化了。考虑更改循环以迭代numberOfItems
而不是100
。您还应该addNewItem
进行检查,以确保您不会超过100
项。null
,因此您尝试在空对象上调用方法getTitle
,自然会抛出NPE。旁注,在markItemOnLoan
中,您错误地比较了字符串。您在checkIfLoaned
中比较标题的方式是正确的。
答案 2 :(得分:0)
为什么没有null时会出现NullPointerException?
不可能发生。
由此我们推断是null
。这很简单。
如果您要成功调试程序绝不否认证据告诉您的内容。
那么null在哪里?
if (items[i].getTitle() != null && items[i].getTitle().equals(title)) {
仅基于这一行,有四种可能的解释:
items
为空items[i]
为空getTitle()
方法每次返回的内容不是String
或不同String
。我们可以通过阅读代码消除第一和第四种解释,第三种解释极不可能(甚至假设它是可能的)。
这使得第二种解释成为“工作假设”。