我正在从事的项目有 3 个课程。第一堂课我没有问题。我从这个方法派生一个类。我依次从这个派生类调用一个方法到我的主要方法中。具体来说,我在线程“main”中遇到异常,我无法调用我的哈希映射。如果有人能帮助我,我将不胜感激。
这是派生类的代码:
import java.util.HashMap;
public class movieSchedule extends movieEvent {
private HashMap<String, String[]>movieTimes;
public movieSchedule() {
this.movieTimes = movieTimes;
}
public void AddMovieSchedule(String name, String[] times) {
movieTimes(name, times);
}
private void movieTimes(String name, String[] times) {
movieTimes.put(name, times);
}
}
这是主要方法相关部分的代码:
movieSchedule athensSchedule = new movieSchedule();
String[] guardiansTimes = {"5:30 P.M.", "7:20 P.M.", "9:00 P.M."};
athensSchedule.AddMovieSchedule("Guardians 4", guardiansTimes);
String[] airTimes = {"6:30 P.M.", "8:45 P.M.", "9:10 P.M."};
athensSchedule.AddMovieSchedule("AIR", airTimes);
String[] marioTimes = {"3:30 P.M.", "4:20 P.M.", "5:00 P.M."};
athensSchedule.AddMovieSchedule("Mario", marioTimes);
String[] oppenheimerTimes = {"7:30 P.M.", "9:20 P.M.", "10:00 P.M."};
athensSchedule.AddMovieSchedule("Oppenheimer", oppenheimerTimes);
String[] insidiousTimes = {"9:30 P.M.", "10:20 P.M.", "11:00 P.M."};
athensSchedule.AddMovieSchedule("Insidious", insidiousTimes);
这是我得到的错误:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.HashMap.put(Object, Object)" because "this.movieTimes" is null
这里的问题是,当您调用
movieSchedule athensSchedule = new movieSchedule();
时,java 转到构造函数,在构造函数中,如果您注意到,您拥有的散列映射等于自身,并且因为您没有初始化它,散列映射为空。所以你需要做的是this.movieTimes = new HashMap<String, String[]>();
基本上,变量“movieTimes”在构造函数中分配给自身。
所以首先,正如@Arun 所说,将 hashmap 作为构造函数参数传递
public MovieSchedule(HashMap<String, String[]> movieTimes) {
this.movieTimes = movieTimes;
}
MovieSchedule athensSchedule = new MovieSchedule(new HashMap<>());
String[] guardiansTimes = {"5:30 P.M.", "7:20 P.M.", "9:00 P.M."};
athensSchedule.AddMovieSchedule("Guardians 4", guardiansTimes);
或
在声明时初始化地图
private HashMap<String, String[]> movieTimes = new HashMap<>();
或 修改默认构造函数代码并将其作为初始化添加为 hashmap
private HashMap<String, String[]> movieTimes ;
public MovieSchedule() {
this.movieTimes = new HashMap<>();
}
另外请注意,按照命名规则,每个单词的首字母要大写 在这里查看 oracle 文档