Null Pinter Exception источник ошибки справки при использовании random
Так что в настоящее время у меня есть файл исходного кода, который должен работать с другим исходным файлом. Когда я запустил второй файл, мне дали исключение нулевого указателя, но я не могу понять, как это исправить. Некоторые детали проекта - это текстовый генератор Маркова, в котором этот файл представляет список цепочек марков объектов String.,
открытый класс StringChain {
private ArrayList<String> tokenArray = null;
private final int ORDER;
private HashMap<Prefix, Suffix> map;
private final String NOT_A_WORD = "NOT A WORD";
public StringChain(int order) {
this.ORDER = order;
}
public List<String> generate(int count, Random rand) {
List<String> returnString = new ArrayList<String>(10);
Prefix currentKey;
String keyString = "";
for (int i = 0; i < ORDER; i++) {
keyString += NOT_A_WORD;
}
currentKey = new Prefix(keyString);
returnString.add(map.get(currentKey).getSuffix(rand));
for (int i = 1; i<count && i < ORDER; i++) {
keyString = "";
for (int j = 0; j < ORDER-i ; j++) {
keyString += NOT_A_WORD;
}
for (int j = 0; j < i; j++) {
keyString += returnString.get(j);
}
currentKey = new Prefix(keyString);
returnString.add(map.get(currentKey).getSuffix(rand));
}
for (int i = ORDER; i < count; i++) {
keyString = "";
for (int j = i-ORDER; j < i; j++) {
keyString += returnString.get(j);
}
currentKey = new Prefix(keyString);
returnString.add(map.get(currentKey).getSuffix(rand));
}
return returnString;
}
public void addItems(Iterator<String> iter) {
if(tokenArray == null)
tokenArray = new ArrayList<String>();
while(iter.hasNext())
tokenArray.add(iter.next());
buildMap();
}
private void buildMap() {
if(this.map == null)
map = new HashMap<Prefix, Suffix>();
for (int i = 0; i < ORDER; i++) {
tokenArray.add(0, NOT_A_WORD);
}
ArrayList<String> suffixArray;
Prefix currentPrefix;
Suffix currentSuffix;
String currentKey = "";
for (int i = 0; i+this.ORDER < tokenArray.size(); i++) {
currentKey = "";
for (int j = i; j < this.ORDER + i; j++) {
currentKey += tokenArray.get(j);
}
currentPrefix = new Prefix(currentKey);
if(map.containsKey(currentPrefix)){
map.get(currentPrefix).addSuffixValue(tokenArray.get(this.ORDER + i));
}
else{
suffixArray = new ArrayList<String>();
suffixArray.add(tokenArray.get(this.ORDER + i));
currentSuffix = new Suffix(currentKey,suffixArray);
map.put(currentPrefix,currentSuffix);
}
}
}
private class Prefix {
private String prefix;
Prefix(String prefix){
this.prefix = prefix;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Prefix prefix1 = (Prefix) o;
if (!prefix.equals(prefix1.prefix)) return false;
return true;
}
@Override
public int hashCode() {
return prefix.hashCode();
}
}
private class Suffix {
private ArrayList<String> suffixArray;
private String prefix;
private Suffix(String prefix, ArrayList<String> suffixArray) {
this.prefix = prefix;
this.suffixArray = suffixArray;
}
public String getSuffix(Random rnd){
return suffixArray.get(rnd.nextInt((suffixArray.size())));
}
public void addSuffixValue(String newPrefix){
this.suffixArray.add(newPrefix);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Suffix suffix = (Suffix) o;
if (!prefix.equals(suffix.prefix)) return false;
if (!suffixArray.equals(suffix.suffixArray)) return false;
return true;
}
@Override
public int hashCode() {
int result = suffixArray.hashCode();
result = 31 * result + prefix.hashCode();
return result;
}
}
}
В частности, ошибка происходит здесь:
public String getSuffix(Random rnd){
return suffixArray.get(rnd.nextInt((suffixArray.size())));
}
Когда запускается с этим исходным файлом: import java.util. *;
/ ** Воспроизведение с StringChain с некоторыми жестко закодированными значениями. * / public class MarkovStringDemo {
private static final int ORDER = 2;
private static final int NUM_WORDS = 50;
/** Regular expression for breaking up words. */
private static final String WORD_REGEX = "(?<=\\w\\W)";
/** Regular expression for getting individual characters. */
private static final String CHAR_REGEX = "(?<=.)";
/** Random number generator for picking random items. */
private static final Random rand = new Random();
public static void main(String[] args) {
String regex = WORD_REGEX;
String demoString = "I am not a number! I am a free man! ";
System.out.println("Initial String: " + demoString);
StringChain chain = new StringChain(ORDER);
// Make a scanner that uses string as source
Scanner strScan = new Scanner(demoString);
// Use word boundaries to break up input.
strScan.useDelimiter(regex);
// Add words from Scanner to the chain
chain.addItems(strScan);
// Generate words
List<String> gibberish = chain.generate(NUM_WORDS, rand);
// Print out the result.
System.out.println("Generated gibberish: ");
for(String word : gibberish) {
System.out.print(word);
}
System.out.println();
// Now let's add another sequence to the same chain
String anotherStr = "They are the eggmen. I am the walrus. ";
System.out.println("Another string: " + anotherStr);
Iterator<String> moreInput = new Scanner(anotherStr).useDelimiter(regex);
chain.addItems(moreInput);
// Print out the new result.
System.out.println("More gibberish: ");
for(String word : chain.generate(NUM_WORDS, rand)) {
System.out.print(word);
}
System.out.println();
// Just to emphasize that addItems is expecting an Iterator,
// not necessarily a Scanner, let's add some strings from a
// List that we create after splitting the string
String oneMoreString =
"I am the very model of a modern Major-General,\n" +
"I've information vegetable, animal, and mineral,\n" +
"I know the kings of England, and I quote the fights historical\n" +
"From Marathon to Waterloo, in order categorical;\n" +
"I'm very well acquainted, too, with matters mathematical,\n" +
"I understand equations, both the simple and quadratical,\n" +
"About binomial theorem I'm teeming with a lot o' news,\n" +
"With many cheerful facts about the square of the hypotenuse.\n";
String[] strs = oneMoreString.split(regex);
List<String> strList = Arrays.asList(strs);
chain.addItems(strList.iterator());
// Print out the new result.
System.out.println("Even more gibberish: ");
for(String word : chain.generate(NUM_WORDS, rand)) {
System.out.print(word);
}
System.out.println();
}
}