Я пытаюсь реализовать этот пример автомата: http://www.javacodegeeks.com/2012/03/automaton-implementation-in-java.html.
Однако при запуске программы продолжает отображаться ошибка:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException:
String index out of range: 3
at java.lang.String.charAt(String.java:686)
at mealy.Input.read(Input.java:7)
at mealy.States$4.next(Input.java:46)
at mealy.Test.main(Test.java:9)
Я попытался изменить строки, ответственные за ошибку, но ничего не изменилось. Может ли кто-нибудь взглянуть на эту программу и помочь мне найти решение?
У меня есть следующий .java:
State.java:
interface State {
public State next(Input in);
}
Примечание: мне пришлось изменить исходный "public Stat next()" на "public State next(Input in);"
Input.java:
class Input {
private String input;
private int current;
public Input(String input) {this.input = input;}
char read() { return input.charAt(current++); }
}
enum States implements State {
Init {
@Override
public State next(Input word) {
switch(word.read()) {
case 'a': return A;
default: return Fail;
}
}
},
A {
@Override
public State next(Input word) {
switch(word.read()) {
case 'a': return A;
case 'b': return B;
case 'c': return C;
case 'd': return null;
default: return Fail;
}
}
},
B {
@Override
public State next(Input word) {
switch(word.read()) {
case 'b': return B;
case 'c': return C;
case 'd': return null;
default: return Fail;
}
}
},
C {
@Override
public State next(Input word) {
switch(word.read()) {
case 'c': return C;
case 'd': return null;
default: return Fail;
}
}
},
Fail {
@Override
public State next(Input word) {
return Fail;
}
};
public abstract State next(Input word);
}
Test.java:
public class Test {
public static void main(String args[]){
State s;
Input in = new Input("abc");
for(s = States.Init; s != null || s != States.Fail; s = s.next(in)) {}
if(s == States.Init) {System.out.println("Valid!");}
else {System.out.println("Failed");}
}
}