package default_package;
import java.util.Scanner;
public class Main_Class
{
public static void main(String[] args)
{
System.out.print("Number of Input NFA States: ");
Scanner s=new Scanner(System.in);
int numberOfStates=s.nextInt();
State[] state=new State[numberOfStates];
for(int i=0;i<numberOfStates;i++)
{
System.out.println("state"+i+" Created.");
}
System.out.println("nState0 is starting point.n");
for(int i=0;i<numberOfStates;i++)
{/////////0,1 linking///////////
System.out.print("state"+i+"'s 0 is headed to: ");
state[i].link0=state[s.nextInt()];//THIS PART
System.out.print("state"+i+"'s 1 is headed to: ");
state[i].link1=state[s.nextInt()];
}
for(int i=0;i<numberOfStates;i++)
{////////epsilon linking//////////
System.out.print("Number of epsilon move for State"+i+":");
int j=s.nextInt();
if(j>0)
{
state[i].epsilon(j);
for(int i1=0;i1<j;i1++)
{
System.out.print("State"+i+"'s epsilon move "+i1+": ");
state[i].linke[i1]=state[s.nextInt()];
}
}
}
System.out.println("Done");
}
}
package default_package;
public class State
{
State link0;
State link1;
State[] linke;
public void epsilon(int a)
{
linke=new State[a];
}
}
如您所见,我想做的是获取NFA并将其转换为DFA。
但是我一直得到NullPointException,我在代码中标记为"THIS PART"。
对我来说,这种方法似乎与通过外部节点类创建 ADT 非常相似,但此代码不起作用。
我尝试更改变量名称等,但找不到这不起作用的具体原因。
有人有一些明智的建议吗?
如果您使用调试器,您将看到state[i]
在您未将其设置为任何内容之前null
。您创建了一个引用数组,但未将它们指向任何内容。
尝试添加
State[] state=new State[numberOfStates];
for(int i=0;i<numberOfStates;i++)
{
// need to actually create each object, not just print that you did it.
state[i] = new State(/* any args needed */);
System.out.println("state"+i+" Created.");
}
首先,你的数组是初始化的,但为空。其次,您是否正在尝试将输入直接输入到数组的表达式中?
state[i].link0=state[s.nextInt()];//THIS PART
你试过这个吗?
int headedTo = s.nextInt();
state[i].link0=state[headedTo];
发生这种情况是因为state[i].link0
正在尝试访问数组中的值,但该值为 null,因为您尝试在进行输入之前获取它,不确定它在填充数组后是否有效。