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();

}

}

0 ответов

Другие вопросы по тегам