import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.Map.Entry;public class Book {
/**
 * 第二题
 */
private String name;// 书名
private int page;// 页数 public Book(String name, int page) {// 有参构造
super();
this.name = name;
this.page = page;
} public String getName() {// setter getter方法
return name;
} public void setName(String name) {
this.name = name;
} public int getPage() {
return page;
} public void setPage(int page) {
this.page = page;
} public static Map<String, Book> map = new HashMap<String, Book>(); public void initMap() {
map.put("SA001", new Book("SOFT_A", 1));// 初始化
map.put("SA002", new Book("SOFT_B", 3));
map.put("SA003", new Book("SOFT_C", 5));
map.put("SA004", new Book("SOFT_D", 7));
map.put("SA005", new Book("SOFT_E", 9));
map.put("SA006", new Book("SOFT_F", 11));
map.put("SA007", new Book("SOFT_G", 13));
map.put("SA008", new Book("SOFT_H", 15));
map.put("SA009", new Book("SOFT_I", 17));
map.put("SA010", new Book("SOFT_J", 19));
} public static void printAllBookInf() {
System.out.println("编号\t书名\t页数");
Set<Entry<String, Book>> set = map.entrySet();
for (Iterator iterator = set.iterator(); iterator.hasNext();) {// 迭代输出对象
Entry<String, Book> entry = (Entry<String, Book>) iterator.next();
System.out.println(entry.getKey() + "\t"
+ entry.getValue().getName() + "\t"
+ entry.getValue().getPage());
}// 打印出所有图书信息
} public static void printOneBookInf() {
Random ran = new Random();
int i = ran.nextInt(10) + 1;// 随机产生书号
String str = String.valueOf(i);
String id = "SA0" + str;
System.out.println("该编号对应的书名:" + map.get(id).getName() + " 页数为:"
+ map.get(id).getPage());
}// 打印随机产生书号的信息 public static void main(String[] args) {
Book.printAllBookInf();// 调用打出所有图书的方法
Book.printOneBookInf();// 调用打出随机产生图书的方法
}
}运行结果:
编号 书名 页数
Exception in thread "main" java.lang.NullPointerException
at Book.printOneBookInf(Book.java:68)
at Book.main(Book.java:74)
出现空指针错误,自己也不怎么会调试,求指点

解决方案 »

  1.   

    这有啥不会调试的?
    at Book.printOneBookInf(Book.java:68)首先就是 68 行代码是哪行?然后怀疑下是哪个对象是null,那么就设置断点,或者直接:
      System.out.println(map.get(id));
    最后我目测说下你可能的问题,是:
      int i = ran.nextInt(10) + 1;// 随机产生书号
      String str = String.valueOf(i);
      String id = "SA0" + str;
    当随机数 i 取值为个位数,比如:9
    那么你最后组装的 id = "SA09";
    显然在map中是找不到的,千万注意: "SA009" 跟 "SA09" 完全不是一个东西!
      

  2.   

    呃 刚看了下  你没有调用map的初始化方法也就是39行的initMap()方法
    map里面没有值 只是一个空的map 你在调用map.get(id)的时候肯定是空指针还有 就是LS所回答的了 我稍改了一下
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Random;
    import java.util.Set;public class Book {
    /**
     * 第二题
     */
    private String name;// 书名
    private int page;// 页数 public Book(String name, int page) {// 有参构造
    super();
    this.name = name;
    this.page = page;
    } public String getName() {// setter getter方法
    return name;
    } public void setName(String name) {
    this.name = name;
    } public int getPage() {
    return page;
    } public void setPage(int page) {
    this.page = page;
    } public static Map<String, Book> map = new HashMap<String, Book>(); public static void initMap() {
    map.put("SA001", new Book("SOFT_A", 1));// 初始化
    map.put("SA002", new Book("SOFT_B", 3));
    map.put("SA003", new Book("SOFT_C", 5));
    map.put("SA004", new Book("SOFT_D", 7));
    map.put("SA005", new Book("SOFT_E", 9));
    map.put("SA006", new Book("SOFT_F", 11));
    map.put("SA007", new Book("SOFT_G", 13));
    map.put("SA008", new Book("SOFT_H", 15));
    map.put("SA009", new Book("SOFT_I", 17));
    map.put("SA010", new Book("SOFT_J", 19));
    } public static void printAllBookInf() {
    System.out.println("编号\t书名\t页数");
    Set<Entry<String, Book>> set = map.entrySet();
    for (Iterator iterator = set.iterator(); iterator.hasNext();) {// 迭代输出对象
    Entry<String, Book> entry = (Entry<String, Book>) iterator.next();
    System.out.println(entry.getKey() + "\t" + entry.getValue().getName() + "\t" + entry.getValue().getPage());
    }// 打印出所有图书信息
    } public static void printOneBookInf() {
    Random ran = new Random();
    int i = ran.nextInt(10) + 1;// 随机产生书号
    System.out.println(i);
    String str = String.valueOf(i);
    String id = "SA00" + str;   //对应的key
    System.out.println("该编号对应的书名:" + map.get(id).getName() + " 页数为:" + map.get(id).getPage());
    }// 打印随机产生书号的信息 public static void main(String[] args) {
    Book.initMap();   //初始化map中的数据
    Book.printAllBookInf();// 调用打出所有图书的方法
    Book.printOneBookInf();// 调用打出随机产生图书的方法
    }
    }
    你试一下吧 
      

  3.   


     public static void printOneBookInf() {
            Random ran = new Random();
            int i = ran.nextInt(10) + 1;// 随机产生书号
            String str = String.valueOf(i);
            String id = "SA00" + str;        System.out.println("该编号对应的书名:" + map.get(id).getName() + " 页数为:"
                    + map.get(id).getPage());
        }// 打印随机产生书号的信息那你这个SA010增么办?
    建议楼主还是换个k键的值,或者把这个改改,可怜的SAO10啊
      

  4.   

    恩,知道,这个我注意到了,修改了。是map没初始化,谢谢