JAVA:添加我的类的instance“;“大门”;映射的值为空
我的代码有问题。这是我第一次使用映射,由于某种原因,添加到第二个try块中的门为空。我看不出错误。错误首先显示在最后一个try块中,当我尝试设置inputgates时,在该块中我得到了null指针 赋予函数的文件有几行,每行看起来如下:先是门的名称,然后是门的类型,然后是许多输入门。(先前创建的盖茨)。有一种称为信号门的门,它只起到启动门的作用。没有输入,只有输出。我们谈论的是NAND、AND、OR门等等 提前谢谢JAVA:添加我的类的instance“;“大门”;映射的值为空,java,map,linkedhashmap,gate,Java,Map,Linkedhashmap,Gate,我的代码有问题。这是我第一次使用映射,由于某种原因,添加到第二个try块中的门为空。我看不出错误。错误首先显示在最后一个try块中,当我尝试设置inputgates时,在该块中我得到了null指针 赋予函数的文件有几行,每行看起来如下:先是门的名称,然后是门的类型,然后是许多输入门。(先前创建的盖茨)。有一种称为信号门的门,它只起到启动门的作用。没有输入,只有输出。我们谈论的是NAND、AND、OR门等等 提前谢谢 public static String Capital(String s){
public static String Capital(String s){
String string = s.substring(0,1).toUpperCase() + s.substring(1).toLowerCase();
string = string + "Gate";
return string;
}
public static Map<String, Gate> createGates(File file){
//variabler.
BufferedReader bufferedReader = null;
String[] lines = null;
String line;
Map<String, Gate> map = new LinkedHashMap<String, Gate>();
int index = 0;
Gate g;
try{
//tests reading the file
bufferedReader = new BufferedReader(new FileReader(file));
//As long as there still are lines left
while((line = bufferedReader.readLine()) != null){
index++;
//as long as the line's not a comment.
if(line.trim().charAt(0) == '*' || line.trim().charAt(0) == '/'){
continue;
}else{
lines = line.split("\\s+");
}
//Gör namnet till att börja med stor bokstav och resten blir små bokstäver.
lines[1] = Capital(lines[1]);
try{
System.out.println("hej");
//Skapar en instans av en gate med class.metoden
g = (Gate) Class.forName(lines[1]).newInstance();
//sätter namnet. Detta använder vi senare
g.setName(lines[0]);
//För in dom i mapen.
map.put(g.getName(), g);
}catch (InstantiationException e) {
new GateException("Something went wrong instantiating the gate " + lines[0] + " on line " + index + " in the code");
} catch (IllegalAccessException e) {
new GateException("Something went wrong in the CreateGates-function for gate " + lines[0] + " on line " + index + " in the code");
} catch (ClassNotFoundException e) {
new GateException("The gate " + lines[0] + " written in the file does not exist. This error occured on line " + index);
}
}
}catch (FileNotFoundException e){
new GateException("Could not load the given file.");
} catch (IOException e) {
new GateException("Something went wrong while trying to read the file. (NOT filenotfoundexception)");
}
//läser filen på nytt som det står i labbbeskrivningen
try{
//samma som ovan. Reader, string och array med strings.
BufferedReader br = new BufferedReader(new FileReader(file));
String l = null;
String[] li = null;
while((l = br.readLine()) != null){
//as long as the line's not a comment.
if(l.trim().charAt(0) == '*' || l.trim().charAt(0) == '/'){
//Omd et är en kommentar, hoppa och kör loopen nästa gång direkt.
continue;
}else{
//annars splitta den
li = l.split("\\s+");
}
//om det är en deklarering av en signalgate så¨ska den forstätta, annars ska den sätta inputs osv som den ska.
if(li.length == 2){
continue;
}else{
Gate gate = map.get(li[0]);
for(int i = 2; i < li.length; i++){
System.out.println(map.get("b"));
gate.setInputGate(map.get(li[i]));
}
}
}
}catch (FileNotFoundException e){
throw new GateException("Error loading the file");
}catch (IOException e){
throw new GateException("Error reading the file");
}
return map;
}
公共静态字符串大写(字符串s){
String String=s.substring(0,1).toUpperCase()+s.substring(1).toLowerCase();
字符串=字符串+门;
返回字符串;
}
公共静态映射createGates(文件){
//可变的。
BufferedReader BufferedReader=null;
字符串[]行=null;
弦线;
Map Map=newlinkedhashmap();
int指数=0;
g门;
试一试{
//测试读取文件
bufferedReader=新bufferedReader(新文件读取器(文件));
//只要还有队伍就行
而((line=bufferedReader.readLine())!=null){
索引++;
//只要这句话不是评论。
如果(line.trim().charAt(0)='*'| | line.trim().charAt(0)='/')){
持续
}否则{
行=行。拆分(\\s+);
}
//Gör namnet直到börja med stor bokstav och resten blir småbokstäver。
第[1]行=资本(第[1]行);
试一试{
System.out.println(“hej”);
//斯卡帕瞬间av门med class.metoden
g=(Gate)Class.forName(第[1]行)newInstance();
//第六个州
g、 集合名(行[0]);
//弗尔在多米马彭。
put(g.getName(),g);
}捕获(实例化异常e){
新的GateException(“在代码中实例化gate”+行[0]+“on line”+索引+”时出错”);
}捕获(非法访问例外e){
新的GateException(“代码中的gate”+行[0]+“on line”+索引+”的CreateGates函数出现错误”);
}catch(classnotfounde异常){
新网关异常(“文件中写入的网关“+行[0]+”不存在。此错误发生在“+索引”行);
}
}
}catch(filenotfounde异常){
new GateException(“无法加载给定文件”);
}捕获(IOE异常){
new GateException(“尝试读取文件时出错。(不是filenotfoundexception)”;
}
//läser filen pånytt som det står i Labbbeskriningen
试一试{
//samma som ovan.Reader,字符串och数组med strings。
BufferedReader br=新的BufferedReader(新文件读取器(文件));
字符串l=null;
字符串[]li=null;
而((l=br.readLine())!=null){
//只要这句话不是评论。
如果(l.trim().charAt(0)='*'| | l.trim().charAt(0)='/')){
//Omd和kommentar,hoppa och kör loopen nästa gång direkt。
持续
}否则{
//安纳斯斯普利塔登酒店
li=l.split(\\s+);
}
//信号门sååska den forstätta的音频数据,以及sätta的输入osv som den ska。
如果(li.length==2){
持续
}否则{
Gate=map.get(li[0]);
对于(int i=2;i
TL;医生:
我敢说,您的问题出现在第90、92和94行:您没有对这些新创建的异常调用throw
由于某些类问题或其他原因,这些类可能永远不会被实例化(解决上述问题将向您展示),因此这会被捕获,但如上所述不会中断执行或日志(可能),但不会实际添加到映射中。当然,它可能是其他的东西
另外,还有一些代码质量点:
- 明智地重用代码:大部分文件读取块都可以提取到一种方法中,这将使调试(或读取)类似的事情变得更加容易 <代码>资本(String S)方法通常应该有小的“C”(或考虑有用的)
- 始终检查从返回的值是否为
null
Gate.java
。您是否可以从文件中添加三行或四行,而不是从文件中读取,以创建Gate
s?下面是错误消息,下面是文件的外观。以*或/开头的行是注释。gateprog.java中没有错误。那是给我们的文件。我们不能改变它。这里是Gate.java只是一个旁注,您可能会发现使用apache的IOUtils将整个文件读入一个字符串,然后使用字符串的split方法和新行作为正则表达式更容易。这将为您提供一个包含所有行的数组,并显著减少代码行数。唯一的问题是,它会将整个文件加载到内存中,因此对于大型文件来说,它不是一个选项。我也是