首页 > 解决方案 > 如何解决 Java IndexOutOfBoundsException?

问题描述

我正在创建一个方法public boolean add (int index, E elem),它在我的链表的索引位置添加一个元素,但每次我得到IndexOutOfBoundsException.

我无法弄清楚为什么,搜索了类似的解决方案,但都是徒劳的。这是我的代码:

public boolean add(int index, E elem) {
    Node<E> node;
    node = new Node<>(elem);
    Boolean result = false;

    if (index > size) {
        System.out.println("Index out of bounds");
    }

    if (index == 0) {
        head = node;
        node.next = indices.get(index + 1);
        node.prev = null;
        node.next.prev = node;
        result = true;
    } else if (index == (size - 1)) {
        Node<E> node1 = indices.get(index - 1);
        tail = node;
        node1.next = node;
        node.next = null;
        node.prev = node1;
        result = true;
    } else if (index > 0 && index < (size - 1)) {
        Node<E> node1;
        Node<E> node2;
        node1 = indices.get(index - 1);
        node2 = indices.get(index);

        node.next = node1;
        node.prev = node2;

        node1.next = node;
        node2.prev = node;

        result = true;

    }

    indices.add(index, node);
    size++;
    System.out.println("Element " + elem + " added at the index: " + index);
    System.out.println("The size of the list now is: " + size);
    return result;
}

这是类字段`public class IDLList {

private class Node<E>{

    E Data;
    Node<E> next;
    Node<E> prev;

    Node(E elem){

        this.Data = elem;
        this.next = null;
        this.prev = null;
    }

    Node (E elem, Node<E> prev, Node<E> next){

     this.Data = elem;
     this.prev = prev;
     this.next = next;

    }
}

    Node<E> head;
    Node<E> tail;
    int size;
    ArrayList<Node<E>> indices;`

这是 get 函数:`public E get(int index){

    Node<E> node;
    node = indices.get(index);
    E value;
    value = node.Data;

    System.out.println("Value at index " + index + " is " + value);
    return value;
}`

标签: java

解决方案


看看你的情况,一定是index >= size因为索引是从零开始的。

public boolean add (int index, E elem) {
    Node<E> node = new Node<>(elem); // You don't need to split definition and initialization

    if(index >= size) {
        System.out.println("Index out of bounds");

        return false;
    }

    if (index == 0) {
        head = node;
        node.next = indices.get(1); // Why is the next the second item, not the first? Maybe `indices.get(0)`?
        node.prev = null;
        node.next.prev = node;
    } else if (index == (size - 1)) {
        Node<E> node1 = indices.get(index - 1);
        tail = node;
        node1.next = node;
        node.next = null;
        node.prev = node1;
    } else if (index > 0 && index < (size - 1)) {
        Node<E> node1 = indices.get(index - 1);
        Node<E> node2 = indices.get(index);
        node.next = node1; // Why is `node1`, not `node2`?
        node.prev = node2; // Vice versa

        node1.next = node;
        node2.prev = node;
    } else {
        return false;
    }
    // If result is `false` why do u to add your node?
    indices.add(index, node);
    ++size;
    System.out.println("Element " + elem + " added at the index: " + index);
    System.out.println("The size of the list now is: " + size);

    return true;
}

推荐阅读