这个错误应该是什么意思:线程“main”中的异常java.lang.NullPointerException?

时间:2015-05-28 07:36:48

标签: java nullpointerexception

该程序用于计算句子中每个单词的频率。 这是源代码:

import java.io.*;
import java.util.Scanner;
class Dictionary
{
  String key;
  int val;
  public Dictionary()
  {
    key="";
    val=0;
  }
 void insert(String k)
  {
    key=k;
    val=1; 
    System.out.println("\nInserted key with value: "+k);
  }
 void update()
  {
    val++;
  }
 String retkey()
 {
   return key;
 }
 int retval()
 {
   return val; 
 }
 public void display()
  {
    System.out.println("Word = "+key);
    System.out.println("Number = "+val);
  }
}
class stack
{
  Dictionary D[]=new Dictionary[50];
  int n;
  int top;
  public stack(int N)
  {
    n=N;
    top=-1;
  // D=new Dictionary[n];
  }
  public void push(String p)
  {
    top++;
    System.out.println("pushing "+p+"\n top=="+top);
    D[top].insert(p);
    System.out.println("\ntop="+top);
  }
  public void check(String p)
  {
    int i=0,flag=1;
    String q="";
    if(top==-1)
    {
      System.out.println("top=-1");
      push(p);
      flag=0;
    }
    else
    {
     for(i=0;i<=top;i++)
     {
       q=D[i].retkey();
       if(q.equals(p))
         { 
          D[i].update();
          flag=0;
         }
        else
        flag=1;
     }
    if(flag==1)
     push(p);
    }
   }
 public void print()
 {
   D[top].display();
 }
}
public class Wrdcnt
{
  public static void main(String[] args)throws Exception
  {
  //  Dictionary D[]=new Dictionary() ;
    String st="";
    String p="";
    System.out.println("Enter String: ");
    Scanner in= new Scanner(System.in);
    st=in.nextLine();
/*    no of words*/
    int n=count(st);
    int j=0;
    System.out.println("No of words: "+n);
    stack stck =new stack(n);
    for(int i=0;i<=st.length();i++)
     {
      if(i==st.length())
       {
        p = st.substring(j,i);
         System.out.println(""+p);
         stck.check(p);
         System.out.println("Checking done for word: "+p);                           
         j=0;
        break;
       }       

       if(st.charAt(i)==' ')
        {
         p = st.substring(j,i);
         System.out.println(""+p);
         stck.check(p);
         j=i+1;
         System.out.println("Checking done for word: "+p);          
        }
     }
  }
  public static int count(String s)
  {
    int w=0;
    for(int i=0;i<s.length();i++)
     {
           if(s.charAt(i)==' ')
               {
                   w++;
               }
     }
   return (w+1);
  }
}

输出:

  

输入字符串:
  玫瑰是红色的   不言而喻:3
  玫瑰
  页首= -1
  推玫瑰   顶== 0
  线程“main”中的异常java.lang.NullPointerException
  at stack.push(Wrdcnt.java:51)
  at stack.check(Wrdcnt.java:61)
  在Wrdcnt.main(Wrdcnt.java:117)

1 个答案:

答案 0 :(得分:0)

在这一行:

D[top].insert(p);

您访问的变量D[top]恰好是null
当试图在insert(p)上调用null时,会出现NullPointerException。

这是因为您只初始化数组,但是没有初始化对象本身以填充数组:

Dictionary D[]=new Dictionary[50];

是为Dictionary[]数组分配位置,但不是自己分配Dictionary个对象。