尝试执行简单操作时的Nullpointerexception

时间:2013-11-18 21:47:50

标签: java nullpointerexception hashmap

我这整个晚上一直在编写代码的一部分,现在我陷入了一种无法逃脱的无效感觉。

代码应该以如下格式读取文件中的所有内容: 有问题的火车线路 每个车站都在火车线上

并将其保存到hashmap中的对象中。

我确实不确定它是否确实保存了对象,但我确实检查了特定的键(站点的名称是站点图中的键)并且它们存在,所以必须正确。< / p>

它发生的代码部分是if语句之后的第二行:

    for (int i = 0; i < fraLinjeListe.size(); i++) {
        for (int j = 0; j < tilLinjeListe.size(); j++) {
            if(fra.linjeList.get(i).equals(til.linjeList.get(j))){
                Linje aktuellLinje=linjerMap.get(fra.linjeList.get(i));
                tilStasjonsNummer=aktuellLinje.stasjonsNummer(til);
                fraStasjonsNummer=aktuellLinje.stasjonsNummer(fra);
                retning=tilStasjonsNummer-fraStasjonsNummer;
                endeStasjonsNavn=aktuellLinje.endestasjon(retning);
                System.out.println("Ta T-bane linje " + aktuellLinje.linjeNummer + " fra " + startStasjon + " til " + sluttStasjon + " i retning " + endeStasjonsNavn + ". Estimert reisetid: " + tid);             
            }   
        }
    }

nullpointer:

  

线程“main”中的异常java.lang.NullPointerException

    at Planlegger.beregnRuter(oblig5.java:130)
    at Planlegger.tilStasjon(oblig5.java:104)
    at Planlegger.fraStasjon(oblig5.java:88)
    at Planlegger.lesFraTil(oblig5.java:77)
    at Planlegger.lesFil(oblig5.java:73)
    at Oblig5.main(oblig5.java:9)

其余代码:

    import java.util.*;
import java.io.*;

class Oblig5{

    public static void main(String[] args){

    Planlegger starten=new Planlegger();
    starten.lesFil();

    }
}
class Planlegger{

    Scanner input=new Scanner(System.in);
    HashMap<String, Linje> linjerMap=new HashMap<String, Linje>();
    HashMap<String, Stasjon> stasjonerMap=new HashMap<String, Stasjon>();

    void lesFil(){

        Linje linjer;
        Stasjon stasjoner;
        String linjeLest="";
        String aktuellLinje="";
        String linjeNummer="";
        char[] linjeNummerA;
        int linjeNummerInt=0;

        try{
            Scanner innFil=new Scanner(new File("Rutetabell.txt"));

            while(innFil.hasNextLine()){

                linjeLest=innFil.nextLine().toLowerCase();

                if(linjeLest.contains("linje")){
                    /* System.out.println("TESTILINJE"); */
                    //Bruker en string for linjenummeret her for å lette bruken av nummeret som key i HashMapen. 

                    linjeNummerInt=Integer.parseInt(linjeLest.replaceAll("[\\D]", ""));
                    // linjeNummerA[0]=linjeLest.split("*linje* ").charAt(0);
                    // linjeNummer=linjeNummer[0];
                    linjeNummer=String.valueOf(linjeNummerInt);
                    linjer=new Linje(linjeNummer);
                    aktuellLinje=linjeNummer;
                    linjerMap.put(linjeNummer, linjer); 

                }else{
/*                  System.out.println("TESTISTASJON"); */
                    //Dersom ikke objektet finnes i hashmapen for stasjoner allerede, så lages objektet og lagres i HashMapen. 
                    if(!stasjonerMap.containsKey(linjeLest)){
                        stasjonerMap.put(linjeLest, new Stasjon(linjeLest));
                    }
                    //Her henter jeg ut objektet vi lager over, og om det ikke lages fordi det allerede eksisterer så hentes det ut uansett.
                    stasjoner=stasjonerMap.get(linjeLest);
                    //Her brukes objektinformasjonen over til å registrere stasjonen i objektet
                    linjer=linjerMap.get(aktuellLinje);
                    linjer.registrerStasjoner(linjeLest, stasjoner);
                    stasjoner.registrerNyLinje(aktuellLinje, linjer);
                }       
            }
            innFil.close();
        }catch(IOException e){
            e.printStackTrace();
        }
/*      System.out.println("Test");
        String sjekkHashmap=input.nextLine();
        if(stasjonerMap.containsKey(sjekkHashmap)){
            System.out.println("Det funker!");
        } */

        lesFraTil();
    }

    void lesFraTil(){
        fraStasjon();
    }

    void fraStasjon(){

        boolean sjekkStasjon=true;
        while(sjekkStasjon){
            System.out.println("Vennligst tast inn fra-stasjonen: ");
            String startStasjon=input.next().toLowerCase();
            if(stasjonerMap.containsKey(startStasjon)){
                sjekkStasjon=false;
                tilStasjon(startStasjon);
            }else{
                System.out.println("Stasjon ikke funnet.");
                sjekkStasjon=true;
            }
        }
    }

    void tilStasjon(String startStasjon){

        boolean sjekkStasjon=true;
        while(sjekkStasjon){
            System.out.println("Vennligst tast inn til-stasjonen: ");
            String sluttStasjon=input.next().toLowerCase();
            if(stasjonerMap.containsKey(sluttStasjon)){
                sjekkStasjon=false;
                beregnRuter(startStasjon, sluttStasjon);
            }else{  
                System.out.println("Stasjon ikke funnet.");
                sjekkStasjon=true;
            }
        }
    }

    void beregnRuter(String startStasjon, String sluttStasjon){

        Stasjon til=stasjonerMap.get(startStasjon);
        Stasjon fra=stasjonerMap.get(sluttStasjon);
        ArrayList<Linje> fraLinjeListe=new ArrayList<Linje>(fra.linjeList);
        ArrayList<Linje> tilLinjeListe=new ArrayList<Linje>(til.linjeList);
        int tilStasjonsNummer, fraStasjonsNummer;
        int retning;
        double tid= 0.0;
        String endeStasjonsNavn;

        tilStasjonsNummer=0;
        fraStasjonsNummer=0;

        for (int i = 0; i < fraLinjeListe.size(); i++) {
            for (int j = 0; j < tilLinjeListe.size(); j++) {
                if(fra.linjeList.get(i).equals(til.linjeList.get(j))){
                    Linje aktuellLinje=linjerMap.get(fra.linjeList.get(i));
                    tilStasjonsNummer=aktuellLinje.stasjonsNummer(til);
                    fraStasjonsNummer=aktuellLinje.stasjonsNummer(fra);
                    retning=tilStasjonsNummer-fraStasjonsNummer;
                    endeStasjonsNavn=aktuellLinje.endestasjon(retning);
                    System.out.println("Ta T-bane linje " + aktuellLinje.linjeNummer + " fra " + startStasjon + " til " + sluttStasjon + " i retning " + endeStasjonsNavn + ". Estimert reisetid: " + tid);             
                }   
            }
        }
    }
}

class Linje{
    String linjeNummer="";
    HashMap<String, Stasjon> linjeStasjoner=new HashMap<String, Stasjon>();
    int antallStasjoner=0;
    int type=0;
    ArrayList<Stasjon> stasjonsList=new ArrayList<Stasjon>();

    Linje(String linjeNummer){
        this.linjeNummer=linjeNummer;
        int linjeNummerInt=Integer.parseInt(linjeNummer);
        if (linjeNummerInt < 10 ){
            type=0;
        }else{
            type=1;
        }
    }

    void registrerStasjoner(String linjeLest, Stasjon stasjon){
        linjeStasjoner.put(linjeLest, stasjon);
        stasjonsList.add(stasjon);
        antallStasjoner++;
    }

    int antall=stasjonsList.size();

    boolean inneholder(Stasjon stasjon){
        boolean sannhetsSjekk=true;
        if(stasjonsList.contains(stasjon)){
            sannhetsSjekk=true;
        }else{
            sannhetsSjekk=false;
        }
        return sannhetsSjekk;
    }

    String endestasjon(int retning) {   
        String endestasjonen;
        if (retning > 0) {
            endestasjonen=stasjonsList.get(0).stasjonNavn;
            return endestasjonen;
        }else{
            endestasjonen=stasjonsList.get(antall-1).stasjonNavn;
            return endestasjonen;
        }
    }

    int stasjonsNummer (Stasjon s) {

        int selveNummeret=0;

        for (int i = 0; i < stasjonsList.size(); i++) {
            if (stasjonsList.get(i) == s) {
                selveNummeret=i+1;
            }
        }
        return selveNummeret;   
    }
}   

class Stasjon{
    String stasjonNavn;
    Linje linje;
    HashMap <String, Linje> stasjonsLinjer=new HashMap<String, Linje>();
    ArrayList<Linje> linjeList=new ArrayList<Linje>();
    int teller=0;

    Stasjon(String linjeLest){
    this.stasjonNavn=linjeLest;
    }

    void registrerNyLinje(String aktuellLinje, Linje linje){
    stasjonsLinjer.put(aktuellLinje, linje);
    linjeList.add(linje);
    teller++;
    }
}

class Overgang{

        Linje l1, l2;
        Stasjon fra,til,bytte;
        Planlegger planlegger;




}

2 个答案:

答案 0 :(得分:0)

如果你在

中得到一个空指针
tilStasjonsNummer=aktuellLinje.stasjonsNummer(til);

这意味着aktuellLinjenull

很可能linjerMap无法在以下语句中获取与密钥fra.linjeList.get(i)对应的值。

Linje aktuellLinje=linjerMap.get(fra.linjeList.get(i));

可能是那个

  • 地图是空的 这可以通过记录地图的大小,并在地图上进行空检查/空检查来确认(linjerMap!= null && !linjerMap.isEmpty()

  • 地图没有正确的对象 这可以通过检查地图是否包含元素(linjerMap.containsKey(fra.linjeList.get(i)))或通过迭代地图来确认内容来确认:

    for(Map.Entry entry : linjerMap) 
    {
        System.out.println(linjerMap.getKey() + " ," +linjerMap.getValue() );
    }
    

答案 1 :(得分:0)

图示出来! 问题是我的行

Linje aktuellLinje=linjerMap.get(fra.linjeList.get(i));

获取对象本身,然后尝试使用该对象作为键在hashmap中查找,给出nullpointer。当我在最后添加.linjeNummer时,它得到了火车线的名称,这也是钥匙,并使用了那个。它现在有效。