数字试验(JAVA) - 线程中的例外"主要" java.lang.ArrayIndexOutOfBoundsException:-13

时间:2016-05-03 19:30:20

标签: java

所以我正在测试一些来自互联网的关于Digital Tries的代码,我有一个项目,我一直坚持这个,因为我尝试的一切都会返回这个错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -13

这是我找到此代码(Code Source

的地方

TrieNode.java

class TrieNode {
    TrieNode[] arr;
    boolean isEnd;
    // Initialize your data structure here.
    public TrieNode() {
        this.arr = new TrieNode[26];
    }
 }

Trie.java

public class Trie {
    private TrieNode root;

   public static void main(String[] args) {
    Trie tr = new Trie();
    tr.insert("TEST");
    System.out.println("TEST " + tr.search("TEST"));
    }

    public Trie() {
        root = new TrieNode();
    }

    // Inserts a word into the trie.
    public void insert(String word) {
        TrieNode p = root;
        for(int i=0; i<word.length(); i++){
            char c = word.charAt(i);
            int index = c-'a';
            if(p.arr[index]==null){
                TrieNode temp = new TrieNode();
                p.arr[index]=temp;
                p = temp;
            }else{
                p=p.arr[index];
            }
        }
        p.isEnd=true;
    }

    // Returns if the word is in the trie.
    public boolean search(String word) {
        TrieNode p = searchNode(word);
        if(p==null){
            return false;
        }else{
            if(p.isEnd)
                return true;
        }

        return false;
    }

    // Returns if there is any word in the trie
    // that starts with the given prefix.
    public boolean startsWith(String prefix) {
        TrieNode p = searchNode(prefix);
        if(p==null){
            return false;
        }else{
            return true;
        }
    }

    public TrieNode searchNode(String s){
        TrieNode p = root;
        for(int i=0; i<s.length(); i++){
            char c= s.charAt(i);
            int index = c-'a';
            if(p.arr[index]!=null){
                p = p.arr[index];
            }else{
                return null;
            }
        }

        if(p==root)
            return null;

        return p;
    }
}

输出:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -13
    at Trie.insert(Trie.java:20)
    at Trie.main(Trie.java:6)

编译:

javac TrieNode.java Trie.java
java Trie

任何解决问题的想法?

2 个答案:

答案 0 :(得分:3)

int index = c - 'a'正在'T'循环的第一次迭代中处理char for

char值而言,'T' - 'a' = -13,因此index = -13会在检查数组时抛出异常。

修改

您的解决方案无效,因为您使用的是大写字母。在文章中,程序仅使用'a'到'z'。您可以轻松更改代码以适应这一点:

char c = Character.toLowerCase(word.charAt(i));

答案 1 :(得分:-1)

请你的插页中的foreloop应该使用lenght-1代替

public TrieNode searchNode(String s){
        TrieNode p = root;
        for(int i=0; i<s.length()-1; i++){
            char c= s.charAt(i);
            int index = c-'a';
            if(p.arr[index]!=null){
                p = p.arr[index];
            }else{
                return null;
            }
        }

        if(p==root)
            return null;

        return p;
    }