繁体   English   中英

由于哈希图未填充或未填充,我的代码中出现了Null指针异常

[英]I'm getting a Null pointer exception in my code because of the hashmap not being filled or maybe not

我得到了这个练习:实现以下类,该类加载并打印一组数据值。

import java.util.Iterator;
public class MyLoader {
    public void loadAndPrintValues(Iterator<String> keysToLoad, Data data, Printer printer) {

        // Load data values like this:
        // String value = data.loadValue(key);

        // Print loaded data value like this:
        // printer.printEntry(key, value);
    }
}

但是,当我进行练习时,可能会从while (keysToLoad.hasNext())key = keysToLoad.next();得到NullPointerException key = keysToLoad.next(); 我以为我有例外,因为“数据”没有填充,但是我不知道该怎么做。 这是我的代码和错误消息

public interface Data{
    //I made this method
     public void makeEntry(String key, String value);
    //given
     public String loadValue(String key);
}

public interface Printer {
     public void displayEntry(String key, String value);
}

import java.util.Iterator;
import java.util.HashMap;

public class MyLoader implements Data, Printer {
    Data data; // = new MyLoader();
    Printer printer; // = new MyLoader();
    Iterator<String> iter; // = new MyLoader();

      String key = "";
String value = "";

HashMap<String, String> ht = new HashMap<String, String>();

public MyLoader(){
//  this.database = null;
//  this.key = null;
//  this.value = null;
//  this.ht = null;
//  this.iter = null;
    System.out.println("now in the constructor");
}

public MyLoader(Iterator<String> iter, Data data, Printer printer){
    this.data = data;
    this.printer = printer;
    this.iter = iter;
}

public void loadAndPrintValues(Iterator<String> keysToLoad, Data data, Printer printer) {
    try {
        if (ht.isEmpty()){
            System.out.println("ht is empty");
            throw new NullPointerException("Database is empty."); 
        }else {
            this.data = data;
        }
           while (keysToLoad.hasNext()){               
           // Load data values like this:
           key = keysToLoad.next();
           value = data.loadValue(key);
           // Print loaded data value like this:
           printer.printEntry(key, value);
       }
    }catch (NullPointerException npe){
        System.out.println("caught null pointer ");
        System.out.println(npe.getMessage());
    }
}

@Override
public void makeEntry(String key, String value){
    ht.put(key, value);
}

@Override
public void printEntry(String key, String value) {  
        System.out.println("[" + key + " : " + value + "]");
}

@Override
public String loadValue(String key) {
    System.out.println("loadValue:" + key);
    if(this.ht.containsKey(key))            
        return this.ht.get(key);
    else {
        System.out.println("No key in database.");
        throw new NullPointerException("No key in data."); 
    }
}

}

public class test {
public static void main(String[] args) {
    try {
    MyLoader mdbl = new MyLoader();

    mdbl.makeEntry("0", "zero");
    mdbl.makeEntry("1", "One");
    mdbl.makeEntry("2", "Two");
    mdbl.makeEntry("3", "Three");

    mdbl.loadAndPrintValues(mdbl.iter, mdbl.data, mdbl.printer);

    }
    catch(NullPointerException e){
        System.out.println(e.getMessage());
    }
}
}

永远不会为mdbl.iter分配一个值,即为null (默认情况下,因为您使用的是MyLoader构造函数,而没有为其分配iter参数)。 因此,当您将其传递给尝试对其执行操作的方法时,您自然会得到NullPointerException (不是错误)。

你不应该

try{ /* ... */ } catch (NullPointerException npe){ /* ... */ }

之所以会阻塞,是因为任何体面的IDE都允许您单击一下即可到达引发异常的行,如果您捕捉到异常并仅向System.out打印一条消息,则情况并非如此。

您正在传递方法loadAndPrintValues()的 Iterator,Data和Printer参数的空值,这将导致NullPointerException

在这一行mdbl.loadAndPrintValues(mdbl.iter,mdbl.data,mdbl.printer); 您没有初始化mdbl.data和mdbl.printer

永远不要捕获NullPointerException。 使用NullPointerException删除catch块,运行它,然后发布堆栈跟踪。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM