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)
这里,我知道那上面,说的是,我好象指针指向的是空的错误但是下面的提示里面是什么意思哦?看的头疼了。。好郁闷哦。希望各大高手,能帮我来解决下下,,,,先谢谢了。
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)
这里,我知道那上面,说的是,我好象指针指向的是空的错误但是下面的提示里面是什么意思哦?看的头疼了。。好郁闷哦。希望各大高手,能帮我来解决下下,,,,先谢谢了。
这个你不会看???130行有错误
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");
}
}
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();
}
}
呵呵,希望你们有兴趣看,,,代码有点长
大家自己运行一下就可以了。但是当前路径下,必须要有两个文件 LrTable.txt
LrInString.txt
其中一个错误是那个LrTemp[i][h].elem的指向有问题
应该可以就算成是这LrTemp[i][h].elem中的一个错误,
应该另一个错误是应该这个而来的。这个错误,通过测试,已经确定就是LrTemp[i][h].elem,这里错了,
但是楞是不知道,为什么错了
因为,前面,我已经定义了。
语法上,也是应该准确的。大家可以就只看,定义这和执行这的一段程序。希望大家看看,,,到底是为什么,,,,?好痛苦呀,,知道错了,但是不知道为什么错,,人生的通过莫过于此呀~~~~