Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Lr.DealDo(Lr.java:130)
at Lr.actionPerformed(Lr.java:292)
at java.awt.Button.processActionEvent(Unknown Source)
at java.awt.Button.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
这里,我知道那上面,说的是,我好象指针指向的是空的错误但是下面的提示里面是什么意思哦?看的头疼了。。好郁闷哦。希望各大高手,能帮我来解决下下,,,,先谢谢了。

解决方案 »

  1.   

    at Lr.DealDo(Lr.java:130)???
    这个你不会看???130行有错误
      

  2.   

    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;class OutNode  //分析过程的每一行
    {
        public int  Order;                  //序号
        public int[]  StateString = new int[10];     //状态栈
        public char[] SignString = new char[30];      //符号栈
        public char[] Grasen = new char[20];    //产生式
        public String InputString;     //输入串
        //protected char[] explen = new char[50];    //解释说明
        //public OutNode(int order,int[] state,char[] sign,char[] grasen,char[] input)
        //{}}class LrTable
    {
         char[] elem = new char[10];
    }
    public class Lr extends WindowAdapter implements ActionListener
    {
        OutNode[] Out = new OutNode[20]; //设定分析过程为20行
      LrTable[] LrRC[] = new LrTable[30][20];
      LrTable[] LrTemp[] = new LrTable[30][20];//设定LR分析表的大小(行列数)
      String TempChar;
      //String S1 = "abcdefghi";/*还没有值*/
      int OutI;//输出分析过程表时候的行数
      
      int N = 9;//终结符,非终结符的总数
      
      int StateTop = 1;
      int SignTop = 1;
      //int leng = Out[0].InputString.length();
      char[] GraArray[] = new char[10][20];/*还没有值*///产生式数组
          
          Frame f;
          Button b1,b2,b3;
          TextArea ta1,ta2;
          TextField tf;
          String s1,s2;//s1数组是分析表的输入存储数组,s2数组是输入串的数组
          
     public Lr()
     {      f = new Frame("Lr分析窗口");
          f.setSize(500,500);
          ta1 = new TextArea();
          ta2 = new TextArea();
          tf = new TextField(20); 
          Label l1,l2,l3;
          l1 = new Label("Lr分析表:");
          l2 = new Label("Lr分析输入串:");
          Panel p1 = new Panel();
          Panel p2 = new Panel();
          b1 = new Button("输入");
          b2 = new Button("执行");
          b3 = new Button("取消");
          b1.addActionListener(this);
          b2.addActionListener(this);
          b3.addActionListener(this);
          p1.add(l2);
          p1.add(tf);
          p1.add(b1);
          p1.add(b2);
          p1.add(b3);
          p2.add(l1);
          p2.add(ta1);
          f.add(ta2);
          f.add(p1,"South");
          f.add(p2,"North");
          f.setVisible(true);
          f.addWindowListener(this);
      }
      public  void DealIn()
      {
        try           {
                                       FileInputStream inFile1 = new FileInputStream("LrTable.txt");
                                       byte inPut1[] = new byte[512];
                                          while(inFile1.read(inPut1) != -1)//分析表的输入
                                       {                                       s1 = new String(inPut1); //分析表数组
                                           ta1.append(s1);                                     
                                       }
                                       inFile1.close();                                   FileInputStream inFile2 = new FileInputStream("LrInString.txt");
                                       byte inPut2[] = new byte[512];
                                       while (inFile2.read(inPut2) != -1)//输入字符串输入
                                       {
                                         
                                         s2 = new String(inPut2);//输入串数组
                                         tf.setText(s2);
                                         
                                       }
                                       inFile2.close();           }
               catch(IOException e)
                       {
                                       System.out.println("I/O error");
                   }
      }
     
     
     
      

  3.   


      public void DealDo()//总控程序
      {

               {      //把输入分析表转化为数组形式
              int j=0;
              int i=0;
              int h=0;
              int k;
              
              for(;j<s1.length();j++)
              {
                   if(s1.charAt(j) == '\n')
                     {i++;h=0;continue;}
                   int n = j+10; 
                   LrTemp[i][h].elem = s1.substring(j,n).toCharArray();//把字符串中的字符一个个输入到字符数组中去
                   j = n;
                   h++;
              }
              LrRC = LrTemp;//赋值
             
                }
                
            int i = 0;
            int Row,Col;
            Out[0] = new OutNode();
            Out[0].Order = 1;// 初使化分析过程第一行
            Out[0].StateString[0] = 0;
            
             Out[0].SignString[0] = '#';
             
             Out[0].Grasen[0] = ' ';
             String InputString2;
             {   
                 String InputString1 = tf.getText();
                 int leng = tf.getText().length();
                 char[] Temp = InputString1.toCharArray();
                 char[] Temp1 = new char[leng];
                 for(int j=0;j<leng;j++)
                      Temp1[leng-j-1] = Temp[j]; 
                 InputString2 = new String(Temp1);
             }//把输入的字符串倒置,以便于压栈
             
             Out[0].InputString = InputString2; //定义为字符串,也可以用文件给其赋值 
             
             while(1 == 1)
             {
                    
                   int leng = Out[0].InputString.length();
                   TempChar = Out[0].InputString.substring(leng-1,leng);
                  Col = ConfirmRC(TempChar);//调用函数,确定列号, 
                  Row = Out[i].StateString[StateTop-1];
                    if(Col == 0)
                        System.out.print("输入串有误,请确认后再次输入");
                    int D = DealRow(Row,Col,i);
                    if(D!=1)//通过行号Row+列号Col+分析过程号i,调用函数,确定分析表相应位置的状态
                        break;
                    i++;
              }  
              OutI = i;
              outstream();  }
        
      public int DealRow(int Row,int Col,int i)//处理每一行
        {
              char[] GraArrayX = new char[20];
              int R_num,S_num;//为移进状态和规约状态的后继数字
              char[] TempLr = new char[10];
              //可以把输入分析表转化成一个2维数组
              TempLr = LrRC[Row+1][Col].elem;
              if(new String(TempLr) == " ")
                 { System.out.println("错误~!~");return -1;}
              if(new String(TempLr) == "acc"||new String(TempLr) == "ACC")
                 { System.out.println("规约成功");return -2;}
              Out[i+1].Order = i+2;
              char[] TempLr1 = TempLr;
              if(new String(TempLr1).substring(0,1) == "S"||new String(TempLr1).substring(0,1) == "s")
                 {
                        //S_num = Integer.parseInt(new String(TempLr).substring(1,2));
                        S_num = NextNum(new String(TempLr));//字符串中一个字符和其他类型比较的问题
                        for(int j = 0;j<StateTop;j++)
                            Out[i+1].StateString[j] = Out[i].StateString[j];
                        Out[i+1].StateString[StateTop] = S_num;//状态栈赋值
                        for(int j = 0;j<SignTop;j++)
                            Out[i+1].SignString[j] = Out[i].SignString[j];
                        char[] TempChar1 = new char[1];
                        int leng = Out[i].InputString.length();
                        TempChar1 = Out[i].InputString.substring(leng-1,leng).toCharArray();
                        Out[i+1].StateString[SignTop] = TempChar1[0];//符号栈赋值
                        String S_blank = "  ";//空格的定义
                        Out[i+1].Grasen = S_blank.toCharArray();//产生式赋值
                        Out[i+1].InputString = Out[i].InputString.substring(0,--leng);
                 }
              if(new String(TempLr1).substring(0,1) == "R"||new String(TempLr1).substring(0,1) == "r")
              {
                       int j=0;
                        //R_num = Integer.parseInt(new String(TempLr).substring(1,2));
                        R_num = NextNum(new String(TempLr));
                        GraArrayX = GraArray[R_num];//产生式的赋值
                        int l =new String(GraArrayX).length();
                        for(;j<l;j++)//确定->符号的位置
                            if(GraArrayX[j]=='-'||GraArrayX[j]=='>')
                                  break;
                        int n = l-j-2;//确定产生式右部的长度
                        StateTop = StateTop-n;
                        SignTop = SignTop-n;
                        for(int k=0;k<StateTop;k++)
                             Out[i+1].StateString[k] = Out[i].StateString[k];
                        int h = ConfirmRC(new String(GraArrayX).substring(0,1));//确定列号
                        char[] StateTemp = LrRC[Out[i+1].StateString[StateTop-1]][h].elem;
                        Out[i+1].StateString[StateTop] = NextNum(new String(StateTemp));//状态栈赋值
                        for(int k=0;k<SignTop;k++)
                             Out[i+1].SignString[k] = Out[i].SignString[k];
                        Out[i+1].SignString[SignTop] = GraArrayX[0];//符号栈的赋值
                        Out[i+1].Grasen = GraArrayX;//产生式的赋值
                        Out[i+1].InputString = Out[i].InputString;
              }
              return 1;
              
        }
        
      public int NextNum(String TempChar1)//确定字母后的那个数字
        {
               int result = 0;
               int l = TempChar1.length();
               
                 for(int i = 1;i<l;i++)
                 {
                      int j = Integer.parseInt(TempChar1.substring(i,i+1));
                      result = result*10+j;
                 }
                 return result;
        }
          
       public void outstream()
       {
              ta2.append("序号 "+"状态栈 "+"符号栈 "+"产生式 "+"输入串"+"\n");
              for(int j=0;j<OutI;j++)//从零开始,输出所有的分析过程表的每一行
                 {
                      String S1 = Integer.toString(Out[j].Order);//序号的输出
                      ta2.append(S1);
                      //状态栈的输入
                      String TempS1 = new String(Out[j].SignString);
                      ta2.append(TempS1);//符号栈的赋值
                      String TempS2 = new String(Out[j].Grasen);
                      ta2.append(TempS2);//产生式的赋值
                      ta2.append(Out[j].InputString);//输入串的赋值
                      
                      
                 }
       }
      public int ConfirmRC(String TempChar1)//确定列号
        {
            int j = N-1;
            int Col;
            for(;j>=0;j--)
            
                if(TempChar1.compareTo(s1.substring(j,j+1))==0)//S1表示Lr分析表字符串
                   {
                     Col = j;
                     return Col;//比较TempChar和分析表中的列字符的大小。如果相等,返回列号.
                   }
            return 0;//否则报错
               
            
         }  
      
      
      public void actionPerformed(ActionEvent e)
      {      if(e.getSource()==b1)//如果点击按钮1,所以激发的事件
          {
           DealIn();//激发输入函数
          }
          if(e.getSource()==b2)//点击按钮2时,激发的事件
          {
           DealDo();//激发执行函数
           //Test();
          }
          if(e.getSource()==b3)//点击按钮3时,激发的事件
          System.exit(0);
      }
      
      public void windowClosing(WindowEvent e)
      {
          System.exit(0);
      }
      
      public static void main(String args[])
      {
           new Lr();
      }
    }
    呵呵,希望你们有兴趣看,,,代码有点长
      

  4.   

    你程序抛出的异常是存放在一个stack里面的。你上面贴的就是这个STACK里面的东西。具体涉及到线程的JVM实现。你知道前面一句话就可以了。
      

  5.   

    程序已经有点变动了,
    大家自己运行一下就可以了。但是当前路径下,必须要有两个文件 LrTable.txt
    LrInString.txt
      

  6.   

    我已经知道了,
    其中一个错误是那个LrTemp[i][h].elem的指向有问题
      

  7.   

    这两个错误,
    应该可以就算成是这LrTemp[i][h].elem中的一个错误,
    应该另一个错误是应该这个而来的。这个错误,通过测试,已经确定就是LrTemp[i][h].elem,这里错了,
    但是楞是不知道,为什么错了
    因为,前面,我已经定义了。
    语法上,也是应该准确的。大家可以就只看,定义这和执行这的一段程序。希望大家看看,,,到底是为什么,,,,?好痛苦呀,,知道错了,但是不知道为什么错,,人生的通过莫过于此呀~~~~