簡體   English   中英

為什么用Java在此代碼中引發nullpointerexception?

[英]why is nullpointerexception thrown in this code in Java?

我無法跟蹤為什么在這里引發了空指針異常,我敢肯定這很簡單,但是卻以某種方式丟失了它。 調用checkoutBook方法時將引發該錯誤。 這里有什么幫助嗎?

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


class Library {

    HashMap<String, List<String>> checkoutBooks;
    Library() {

        HashMap<String, List<String>> checkoutBooks = new HashMap<String, List<String>>();

    }


    public void checkoutBook(String isbn, String patron) {

        if (checkoutBooks.containsKey(isbn)) {
         checkoutBooks.get(isbn).add(patron);
        } else {
            List<String> patronlist = new ArrayList<String>();
            patronlist.add(patron);
            checkoutBooks.put(isbn, patronlist);
            System.out.println("hello");
        }
    }


    public static void main(String[] args){
        Library library = new Library();
        library.checkoutBook("000", "Cay Horstman");
       library.checkoutBook("000", "Sharron Morrow");

     }

}

由於您沒有為該變量分配任何值:

HashMap<String, List<String>> checkoutBooks;

您剛剛在構造函數中定義了一個新對象。 因此,請刪除該實例checkoutBooks變量,或執行以下操作:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


class Library {

    HashMap<String, List<String>> checkoutBooks;
    Library() {

        checkoutBooks = new HashMap<String, List<String>>();

    }


    public void checkoutBook(String isbn, String patron) {

        if (checkoutBooks.containsKey(isbn)) {
         checkoutBooks.get(isbn).add(patron);
        } else {
            List<String> patronlist = new ArrayList<String>();
            patronlist.add(patron);
            checkoutBooks.put(isbn, patronlist);
            System.out.println("hello");
        }
    }


    public static void main(String[] args){
        Library library = new Library();
        library.checkoutBook("000", "Cay Horstman");
       library.checkoutBook("000", "Sharron Morrow");

     }

}

因為您沒有在構造函數中初始化字段 checkoutBooks 您使用相同的名稱初始化了局部變量。 將您的構造函數更改為此:

HashMap<String, List<String>> checkoutBooks;
Sandbox() {

    checkoutBooks = new HashMap<String, List<String>>();

}

在Library構造函數中,您聲明一個名為checkoutBooks的局部變量,並將其初始化,但不要在類級別初始化同名字段。 一些建議:

  1. 至少,要解決該錯誤,請更改構造函數以使其僅執行賦值,而不是聲明新變量:

     Library() { checkoutBooks = new HashMap<String, List<String>>(); } 
  2. 由於在構造之后您無需重新分配checkoutBooks字段,因此可以將字段聲明為final 然后它將在編譯時立即捕獲此類錯誤,因為需要初始化final字段。 它還可以防止以后意外重新分配該字段,從而增強了魯棒性。

     class Library { final HashMap<String, List<String>> checkoutBooks; ... 
  3. 由於您無需在構造函數中執行任何其他操作,因此可以將初始化直接內聯到字段聲明中:

     class Library { final HashMap<String, List<String>> checkoutBooks = new HashMap<String, List<String>>(); // no constructor ... 
  4. 從Java 7開始,可以避免使用<>重復類型參數:

     class Library { final HashMap<String, List<String>> checkoutBooks = new HashMap<>(); 

當您使用HashMap<String, List<String>> checkoutBooks = new HashMap<String, List<String>>();時, checkoutBooks.containsKey為null HashMap<String, List<String>> checkoutBooks = new HashMap<String, List<String>>(); 在構造函數內部,這就是為什么要獲取異常

class Library {

    HashMap<String, List<String>> checkoutBooks;
    Library() {

       checkoutBooks = new HashMap<String, List<String>>(); // just change here 

    }


    public void checkoutBook(String isbn, String patron) {

        if (checkoutBooks.containsKey(isbn)) {
         checkoutBooks.get(isbn).add(patron);
        } else {
            List<String> patronlist = new ArrayList<String>();
            patronlist.add(patron);
            checkoutBooks.put(isbn, patronlist);
            System.out.println("hello");
        }
    }


    public static void main(String[] args){
        Library library = new Library();
        library.checkoutBook("000", "Cay Horstman");
       library.checkoutBook("000", "Sharron Morrow");

     }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM