我是Java的新手。试图做一个简单的库,我遇到了一个问题。
“线程中的异常”主“java.lang.NullPointerException 在Book.showData(Book.java:22) 在Book.main(Book.java:28) Java结果:1“
我知道如何使用一种方法来完成这项工作。但是当我使用两种方法 - 一种用于读取而另一种用于显示数据时,我得到一个错误。我认为我没有正确地使用字符串矩阵,但我真的不知道如何修复它。
import java.util.Scanner;
public class Book {
int bookID;
String bookName;
String bookAuthor;
int publishDate;
public String readData(){
Scanner scanner = new Scanner(System.in);
System.out.println("Book's name: ");
this.bookName = scanner.nextLine();
System.out.println("\nAuthor's name: ");
this.bookAuthor = scanner.nextLine();
System.out.println("\nYear of publish: ");
this.publishDate = scanner.nextInt();
return bookAuthor;
}
public void showData(){
String[] names = bookAuthor.split(" ");
System.out.println(bookName+" author is "+String.format("%s %s", names[0], names[names.length-1]));
}
public static void main(String args[]){
new Book().readData();
new Book().showData();
}
}
答案 0 :(得分:4)
您正在创建Book
个对象的两个实例。因此,当您在第二个上调用showData
时,您的字符串未初始化(对象的默认值为null
),因此当您尝试拆分{{1}时,会抛出NPE变量。
您必须创建一个bookAuthor
实例,然后对其执行操作。
Book
答案 1 :(得分:1)
您在main方法中创建了Book 2次的新实例。因此,在调用showData()
时,实例变量未初始化,
尝试
Book book = new Book();
book.readData();
book.showData();
您也可以将readData()
移到构造函数
import java.util.Scanner;
public class Book {
int bookID;
String bookName;
String bookAuthor;
int publishDate;
public Book() {
Scanner scanner = new Scanner(System.in);
System.out.println("Book's name: ");
this.bookName = scanner.nextLine();
System.out.println("\nAuthor's name: ");
this.bookAuthor = scanner.nextLine();
System.out.println("\nYear of publish: ");
this.publishDate = scanner.nextInt();
return bookAuthor;
}
public void showData(){
String[] names = bookAuthor.split(" ");
System.out.println(bookName+" author is "+String.format("%s %s", names[0], names[names.length-1]));
}
public static void main(String args[]){
new Book().showData();
}
}
答案 2 :(得分:1)
您在readData()
的不同实例上呼叫showData()
和Book
。您需要创建一个Book
类实例并在该实例上调用您的方法。
将您的main()更改为:
public static void main(String args[]){
Book book = new Book();
book.readData();
book.showData();
}
答案 3 :(得分:1)
问题是您正在处理Book
的两个不同实例。创建一个Book实例并使用readData()
和showData()
。
Book book = new Book();
book.readData();
book.showData();
答案 4 :(得分:1)
因为您创建了同一个类的两个实例而不是使用相同的类。因此,您在bookAuthor
中初始化的readData()
变量不再存在于showData()
中。
将main()
功能更改为
public static void main(String args[]){
Book foo = new Book();
foo.readData();
foo.showData();
}
答案 5 :(得分:1)
问题在于你的main()方法:
public static void main(String args[]){
new Book().readData();
new Book().showData();
}
在这一行new Book().readData();
中,您正在创建新的Book实例并将数据插入到该实例中。但是,当您尝试显示数据时,您正在创建另一个实例,并尝试从那里显示数据,但它是空的,因为它是新的new Book().showData();
要修复它,您必须创建1个实例,在其中插入数据,并显示来自该类的同一实例的数据。例如:
public static void main(String args[]){
Book book = new Book(); //create book object
book.readData(); //insert data into it
book.showData(); //show data from the same object
}
答案 6 :(得分:1)
您正在创建两个类Book实例。创建一个实例并调用readData()和showData()函数。 示例代码
public static void main(String args[]){
Book myBook = new Book();
myBook.readData();
myBook.showData();
}
所有其他功能都可以保持不变。
抛出Nullpointer,因为在创建新实例时,showData()的字符串中没有值。