JAVA:添加我的类的instance“;“大门”;映射的值为空

JAVA:添加我的类的instance“;“大门”;映射的值为空,java,map,linkedhashmap,gate,Java,Map,Linkedhashmap,Gate,我的代码有问题。这是我第一次使用映射,由于某种原因,添加到第二个try块中的门为空。我看不出错误。错误首先显示在最后一个try块中,当我尝试设置inputgates时,在该块中我得到了null指针 赋予函数的文件有几行,每行看起来如下:先是门的名称,然后是门的类型,然后是许多输入门。(先前创建的盖茨)。有一种称为信号门的门,它只起到启动门的作用。没有输入,只有输出。我们谈论的是NAND、AND、OR门等等 提前谢谢 public static String Capital(String s){

我的代码有问题。这是我第一次使用映射,由于某种原因,添加到第二个try块中的门为空。我看不出错误。错误首先显示在最后一个try块中,当我尝试设置inputgates时,在该块中我得到了null指针

赋予函数的文件有几行,每行看起来如下:先是门的名称,然后是门的类型,然后是许多输入门。(先前创建的盖茨)。有一种称为信号门的门,它只起到启动门的作用。没有输入,只有输出。我们谈论的是NAND、AND、OR门等等

提前谢谢

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方法和新行作为正则表达式更容易。这将为您提供一个包含所有行的数组,并显著减少代码行数。唯一的问题是,它会将整个文件加载到内存中,因此对于大型文件来说,它不是一个选项。我也是