Что вызывает ошибку ArrayIndexOutOfBounds в этом коде? - PullRequest
0 голосов
/ 05 мая 2011

Я получаю ошибки при выполнении следующего кода.Я предоставил комментарии, чтобы описать, что происходит.

// Node
class TreeNode {
    char value;
    TreeNode left;
    TreeNode right;
}

// Main class
public class BinaryTree {
    // Global variables
    char[] preorder;
    int i = 0;

    // Main method runs gatherOutput
    public static void main(String[] args) throws IOException {
        new BinaryTree().gatherOutput();
    }

    // This takes a null tree as input from the gatherOutput method
    // and whenever a 0 is encountered in the preorder character array
    // (from a string from System.in) a new external node is created with
    // a value of 0. Whenever a letter is encountered in the character
    // array, a new internal node is created with that letter as the value.
    //
    // =====ArrayOutOfBoundsException occurs somewhere here=====
    //
    public TreeNode createTree(TreeNode tree) throws IOException {
        if (preorder[i] == 0) {
            tree = new TreeNode();
            tree.value = 0;
            tree.left = tree.right = null;
            i++;                
        } else {
            tree = new TreeNode();
            tree.value = preorder[i];
            i++;
            createTree(tree.left);
            createTree(tree.right);
        }
        return tree;
    }


    // Supposed to print out contents of the created binary trees.
    // Just for testing purposes, but it's not working right now for some reason.
    public void preorderTraversal(TreeNode tree) {
        if (tree != null) {
            System.out.println(tree.value + " ");
            preorderTraversal(tree.left);
            preorderTraversal(tree.right);
        }
    }

    // Reads System.in for the Strings used in making the binary tree
    // and is supposed to make a different binary tree for every line of input
    public void gatherOutput() throws IOException {
        TreeNode tree = null;

        InputStreamReader input = new InputStreamReader(System.in); 
        BufferedReader reader = new BufferedReader(input);

        preorder = reader.readLine().toCharArray();

        while (reader.readLine() != null) {
            tree = createTree(tree);
            preorderTraversal(tree);
            i = 0;
        }
    }
}

Я получаю ошибку ArrayIndexOutOfBounds всякий раз, когда у меня есть более одной строки ввода.Например:

b
b

Трассировка стека:

Исключение в потоке "main" java.lang.ArrayIndexOutOfBoundsException:1
в btsmall.createTree (btsmall.java:22)
в btsmall.createTree (btsmall.java:31)
в btsmall.gatherOutput (btsmall.java:53)
в btsmall.main(btsmall.java:18)

Это происходит в методе createTree, но я не могу точно определить, почему.Метод preorderTraversal, похоже, не работает, даже когда у меня есть только одна строка ввода, так как я не получаю вывод от запуска программы, но я не знаю почему.Может кто-нибудь помочь мне, пожалуйста?

Спасибо.

РЕДАКТИРОВАТЬ: я внес изменения в следующие два метода, и я больше не получаю ошибку ArrayIndexOutOfBounds.

public void createTree(TreeNode tree) throws IOException {
    if (i >= preorder.length) {
        i++;
    } else if (preorder[i] == '0') {
        tree = new TreeNode();
        tree.value = '0';
        tree.left = tree.right = null;
        i++;                
    } else {
        tree = new TreeNode();
        tree.value = preorder[i];
        i++;
        createTree(tree.left);
        createTree(tree.right);
    }
}

public void gatherOutput() throws IOException {
    InputStreamReader input = new InputStreamReader(System.in); 
    BufferedReader reader = new BufferedReader(input);

    String line = null;
            TreeNode tree = new TreeNode();
    while ((line = reader.readLine()) != null) {
        preorder = line.toCharArray();
        tree = createTree(tree);
        preorderTraversal(tree);
        i = 0;
    }
}

Однаковывод preorderTraversal выводит один квадрат вместо значений для всех узлов в предзаказе.

Ответы [ 4 ]

3 голосов
/ 05 мая 2011

Здесь мало что происходит. Наиболее заметным является то, что вы читаете строку, а затем сразу же пытаетесь прочитать другую строку, как показано ниже.

preorder = reader.readLine().toCharArray();

while (reader.readLine() != null) {

Вам просто нужно прочитать строку один раз. Например:

String line = null;
while ((line=reader.readLine()) != null){
    System.out.println(line);
    preorder = line.toCharArray();
}

Также ваш чек:

if (preorder[i] == 0) {

взорвется, когда вы достигнете конца строки, потому что вы никогда не проверяете, будет ли i выходить за пределы массива. Я не уверен, что вы действительно хотите проверить там.

2 голосов
/ 05 мая 2011

вы читаете пустую строку, поэтому preorder.length = 0;предзаказ [0] выходит за пределы?

1 голос
/ 05 мая 2011

Похоже, ваш код сначала будет введен в оператор else:

if (preorder[i] == 0) {
        tree = new TreeNode();
        tree.value = 0;
        tree.left = tree.right = null;
        i++;                
    } else {
        tree = new TreeNode();
        tree.value = preorder[i];
        i++;
        createTree(tree.left);
        createTree(tree.right);
    }

Затем вы увеличиваете i и вызываете createTree(tree.left), где i превышает длину массива.

Это было бы мое предположение, но, как указал @Джон Топли;отладчик твой друг.

1 голос
/ 05 мая 2011

Вы не инициализируете char [] preorder в конструкторе Binary Tree, а затем используете preorder = reader.readLine().toCharArray();

для хранения массива char, чтобы он не имел размер, поэтомувыдает ArrayIndexOutOfBouds

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...