NullPointerException但为什么

时间:2013-10-17 00:29:44

标签: java nullpointerexception

我知道NullPointerExceptions是你尝试提供它没有的0个属性时得到的。但为什么我在这里得到一个nullpointerexception?它说这应该是代码的这一部分:

    class Oblig3A{
    public static void main(String[]args){

    OrdAnalyse oa = new OrdAnalyse();
    String filArgs=args[0];
    oa.analyseMetode(filArgs);
    }
}

class OrdAnalyse{
    void analyseMetode(String filArgs){

    //Begynner med aa opprette alle variabler som trengs, disse deklareres rett under. De ligger her oppe bare for at jeg skal ha oversikten over de.
    Scanner input, innfil;
    String[] ord, fortelling;
    int[] antall;
    int antUnikeOrd;
    PrintWriter utfil;

    //Deklarerer alle bortsett fra de som har med fil aa gjore, disse deklareres inne i en try-catch-loop (printwriter utfil og scanner innfil).
    input=new Scanner(System.in);
    ord=new String[5000];
    antall=new int[5000];
    antUnikeOrd=0;

    try{
        innfil=new Scanner(new File(filArgs));
        //Naa skal jeg dele opp prosessen litt for aa faa inn funksjonaliteten for aa for eksempel sette alle ord til lowercase.

        while(innfil.hasNext()){
        fortelling=innfil.nextLine().toLowerCase().split(" ");
            for(int i=0; i<fortelling.length; i++){
               for(int j=0; j<5000; j++){
               if(fortelling[i].equals(ord[j])){
                   antall[j]+=1;
               }else if(!ord[j].equals(fortelling[i])){ //This is line 39
                   ord[j]=fortelling[i];
                   antall[j]+=1;
                   antUnikeOrd+=1;
               }
               System.out.print(fortelling[i]);
               System.out.print(fortelling.length);
               }
           }
           }
       }catch(Exception e){
           e.printStackTrace();
       }
    }
 }

stacktrace:

java.lang.NullPointerException
    at OrdAnalyse.analyseMetode(Oblig3A.java:39)
    at Oblig3A.main(Oblig3A.java:9)

我现在已经确认它确实是有问题的行,但是

2 个答案:

答案 0 :(得分:0)

假设innfilScanner

尝试使用innfil.hasNextLine()代替innfil.hasNext()

答案 1 :(得分:0)

你在这里创建一个String数组

ord=new String[5000];

但永远不要初始化数组中的任何字符串。

所以这一行

}else if(!ord[j].equals(fortelling[i])){

如果条件fortelling[i].equals(ord[j])失败,将抛出NPE,这将是它的要求 'fortelling[i]是否等于null'它不能或者是投掷NPE的罪魁祸首


如果对此

的陈述,你可以改变你
if(fortelling[i].equals(ord[j]))
      antall[j]+=1;
else   // remove your if statement here
{
      ord[j]=fortelling[i];
      antall[j]+=1;
      antUnikeOrd+=1;
}

好像这个fortelling[i].equals(ord[j]是假的,就像说这个if(!ord[j].equals(fortelling[i])

一样