2013-02-14 63 views
-1

我不知道如果我在執行插入或正確添加,但我得到這個錯誤:方法插入/追加數組列表中的元素

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 at AListInt.insert(AListInt.java:81) // listArray[i+1] = listArray[i]; at ListTest.main(ListTest.java:52) // list.insert(i);

而且我不能使用的java.util.ArrayList 這裏是代碼和類它:

類:

public class AListInt { 


int [] listArray; 
int listSize; 
int curr; // current position 

AListInt() { 
    listSize = 0; 

    // note that curr = -1 when listSize = 0 
    curr = -1; 
    listArray = new int [2]; 
} 

public int getValue() throws DSException { 
    return listArray[curr]; 
     //returns the value of current position 
     //throw exception when there are no elements in the list 
} 

public int length() { 
    return listSize; 
    //return # of elements in the list 
} 


public int currPos() { 
    return curr; 
    //return current position. 
} 

public void moveToPos (int pos) throws DSException { 
    curr = pos; 
     //move the current position to pos 
     //throw exception if pos is not a valid position 
} 

public void moveToStart() throws DSException { 
    curr = 0; 
     //move the current position to the start of the list 
     //throw exception if no elements are in the list 
} 


public void moveToEnd() throws DSException { 
    curr = listSize; 
     //move the current position to the end of the list 
     //throw exception if no elements are in the list 
} 


public void prev() throws DSException { 
    if(curr != 0) 
    { 
     curr--; 
    } 
     //move current position to the previous element 
     //throws exception if the previous position is not legal or 
     // if there are no elements in the list 
} 


public void next() throws DSException { 
    if(curr < listSize) 
    { 
     curr++; 
    } 
     //move current position to the next element 
     //throws exception if the next position is not legal or 
     // if there are no elements in the list 
} 


public void insert (int item) { 

    for(int i = listSize-1; i >= curr; i++) 
    { 
     listArray[i+1] = listArray[i]; 

    } 
    listArray[curr] = item; 
    listSize ++; 

    int[]temp = new int[listArray.length*2]; 
    for(int i = 0; i< listSize; i++) 
    { 
     temp[i] = listArray[i]; 
    } 
    listArray = temp; 

    // inserts item to the current position 
    // if not enough memory, double the size of listArray 
} 


public void append (int item) { 
    listArray[listSize++] = item; 

    int[]temp = new int[listArray.length*2]; 
    for(int i = 0; i< listSize; i++) 
    { 
     temp[i] = listArray[i]; 
     listArray = temp; 
    } 
    // inserts item to the end of the list 
    // if not enough memory, double the size of listArray  
} 

public int remove() throws DSException { 
    if((curr < 0)||(curr > listSize)) 
    { 
      return -1; 
    } 

int item; 
item = listArray[curr]; 

    for(int i = curr; i < listSize - 1; i++) 
    { 
     listArray[i] = listArray[i+1]; 
    } 
    listSize --; 
    return item; 
     //removes the element at the current position 
     //returns the removed element 

} 

public void clear() { 
    listSize = 0; 
    curr = -1; 
    //reset size. Set current position to be -1 
} 

public boolean find (int val) { 
    for(int i = 0; i > listSize; i ++) 
    { 
     if(listArray[i] == val) 
     { 
      return true; 
     } 
    } 
    return false; 
    //searches for val in the list 
    //returns true if found and false if not found 
} 

public void print() { 
    System.out.print("<"); 
    for(int i = 0; i < listSize; i++) 
    { 
     System.out.print(listArray[i]); 

     if(listSize == -1) 
     { 
      System.out.print("-1"); 
     } 
    } 
    System.out.print(">"); 
    //outprint the list 
} 

}

例外:

public class DSException extends Exception { 
    public DSException() { 
    } 

    public DSException(String msg) { 
    super(msg); 
    } 
} 

主:

public class ListTest { 

public static void main (String[] args) { 

try { 
    AListInt list = new AListInt(); 

    list.print(); 


    // test length() 
    System.out.println (list.length()); 


    // test currPos() 
    System.out.println (list.currPos()); 

    // insert some numbers 
    for (int i = 0; i < 4; i++) { 
    list.append(i); 
    list.print(); 
    } 

    list.moveToPos(0); 
    list.print(); 

    list.moveToEnd(); 
    list.print(); 


    // test getValue()                                      
    System.out.println (list.getValue()); 

    System.out.println ("remove: " + list.remove()); 
    list.print(); 

    list.moveToStart(); 
    list.print(); 

    System.out.println ("remove: " + list.remove()); 
    list.print(); 

    list.clear(); 
    list.print(); 

    list.clear(); 
    list.print(); 

    System.out.println ("find 0 : " + list.find (0)); 

    for (int i = 0; i < 4; i++) { 
    list.insert(i); 
    list.print(); 
    } 

    for (int i = 0; i < 5; i++) { 
    System.out.println ("find " + i + " : " + list.find (i)); 
    list.print(); 
    } 

    list.next(); 
    list.print(); 

    list.insert (-9); 
    list.print(); 

    list.append (-2); 
    list.print(); 

    list.moveToEnd(); 
    list.insert (-1); 
    list.print(); 


    System.out.println ("remove: " + list.remove()); 
    list.print(); 

} catch (DSException e) { 
    e.printStackTrace(); 
} 

} 

}

回答

1

您閱讀陣列之外。在

for(int i = listSize-1; i >= curr; i++) 
{ 
    listArray[i+1] = listArray[i]; 

} 

如果i = listSize -1,然後listArray[i+1]listArray[listSize],這是出界,因爲數組從0length -1

編輯:

但由於listArray具有2的初始大小,並且你在每次插入時都會將尺寸加倍。然而,在第一插入curr-1,並且由於終止是i >= curr,環路將被輸入,你將讀listArray[-1](出界)

+0

奈斯利斑點的位置。 – dreamcrash 2013-02-14 01:50:38

0

它得是listArray [I] = listArray [I-1]

因爲你正在轉移listArray [I-1]的位置向listArray的[I]