2014-10-01 2 views
2

Я получаю исключение нулевого указателя при попытке запустить этот метод, цель состоит в том, чтобы заполнить массив объектов booklist, но не более трех объектов. Ошибка возникает, когда я установил список книг [0] = bПроблема с массивом объектов

private Book [] booklist; 
public boolean borrowBook(Book b) 
{ 
    if(booklist == null) 
    { 
     booklist[0] = b; 
     System.out.println(this.name+" has successfully borrowed "+b); 
     return true; 
    } 
    if(booklist.length < 3) 
    { 
     booklist[booklist.length] = b; 
     System.out.println(this.name+" has successfully borrowed "+b); 
     return true; 
    } 
    System.out.println(this.name+" has reached the borrowing limit! Return those books "+this.name); 
    return false; 
+4

Вам необходимо инициализировать 'booklist'. – August

+0

Я не настолько разбираюсь в объектных массивах, могу ли я инициализировать его и заставить мой метод работы заемщика работать так, как есть? – Tolkingdom

+2

, конечно, если 'booklist == null' вы не можете получить доступ к booklist [0]' – Baby

ответ

3

Попробуйте это.

private Book [] booklist; 

public boolean borrowBook(Book b) { 
    if (booklist == null) { 
     booklist = new Book[3]; 
     booklist[0] = b; 
     return true; 
    } 
    for (int i = 0; i < booklist.length; i++) { 
     if (booklist[i] == null) { 
      booklist[i] = b; 
      return true; 
     } 
    } 
    return false; 
} 

public static void main(String[] args) { 
    Book caller = new Book(); 
    System.out.println(caller.borrowBook(new Book())); 
    System.out.println(caller.borrowBook(new Book())); 
    System.out.println(caller.borrowBook(new Book())); 
    System.out.println(caller.borrowBook(new Book())); 
} 
+0

Спасибо за это! , Другие ответы были в порядке, но мой учитель ожидает, что я буду использовать обычный массив для этого проекта. Спасибо всем, и спасибо wittakarn – Tolkingdom

+0

Добро пожаловать. – wittakarn

1

Аналогичным образом, @August сказал. До линии booklist[0] = b;

Вы должны парафировать с использованием booklist = new Book[3];

+0

Будет ли мой метод работать, не позволяя ему хранить более 3 книг в этом массиве? – Tolkingdom

+0

Да, вы можете попробовать. – wittakarn

+0

Как я могу проверить, сколько ненулевых объектов находится в списке книг. Инициализируя его до длины 3, 'if (booklist.length <3)' не будет работать. как я могу проверить – Tolkingdom

1

Java массивы не динамически размера, то можно написать метод, чтобы сделать это. Например,

private static Book[] addBook(Book[] arr, Book b) { 
    int newLen = (arr == null ? 1 : arr.length + 1); 
    Book[] dest = new Book[newLen]; 
    System.arraycopy(arr, 0, dest, 0, arr == null ? 0 : arr.length); 
    dest[newLen - 1] = b; 
    return dest; 
} 

Затем вы можете использовать его с чем-то вроде

public boolean borrowBook(Book b) { 
    if (booklist == null || booklist.length < 3) { 
     booklist = addBook(booklist, b); 
     System.out.println(this.name + " has successfully borrowed " + b); 
     return true; 
    } 
    System.out.println(this.name + " has reached the borrowing limit! " 
      + "Return those books " + this.name); 
    return false; 
} 

В качестве альтернативы, вы можете просто выделить массив размером n или использовать коллекцию как ArrayList.

1

Инициализация booklist исправит NullPointerException, но логика вашего метода по-прежнему будет ошибочной. Похоже, что вы хотите добавить append новую книгу в массив проверенных книг, тогда как ваш метод будет устанавливать только последний элемент в массиве.

Чтобы исправить это, вы можете использовать счетчик, в котором хранится индекс последней вставленной книги. Или я предлагаю использовать растущий массив, такой как ArrayList, который поддерживает добавление новых элементов с помощью ArrayList#add.

4

Вам нужно ArrayList вместо array

ArrayList<Book> booklist = new ArrayList<Book>(); 

public boolean borrowBook(Book b){ 
    if(booklist.size() == 0){ 
     booklist.add(b); 
     System.out.println(this.name+" has successfully borrowed "+b); 
     return true; 
    } 
    if(booklist.size() < 3){ //I'm not sure what you are trying to achieve here 
     booklist.add(booklist.size(), b); 
     System.out.println(this.name+" has successfully borrowed "+b); 
     return true; 
    } 

    System.out.println(this.name+" has reached the borrowing limit! Return those books "+this.name); 
    return false; 
} 
Смежные вопросы