2017-03-01 2 views
0

So habe ich versucht, den Maximalwert innerhalb einer Array-Typ "T" -Liste zurückgeben und einen Fehler bei der Verwendung von compareTo erhalten. Dies ist der vollständige Code.Fehler beim Versuch, Max-Wert im Array zu erhalten

package myUtil; 

public class SimpleListAry<T extends java.lang.Comparable<T>> extends java.lang.Object implements SimpleList<T> { 
    private T[] myList; 
    private int size; 
    public SimpleListAry(){ 
     myList = (T[])new Comparable[10]; 
    } 
    public SimpleListAry(int capacity){ 
     if (capacity <= 0){ 
      throw new IllegalArgumentException(); 
     } 
     myList = (T[]) new Object [capacity]; 
    } 

    @Override 
    public int size() { 
     size = myList.length; 
     return size; 
    } 
    @Override 
    public T get(int i) { 
     return myList[i]; 
    } 

    @Override 
    public T set(int i, T item) { 
     return myList[i] = item; 
    } 

    @Override 
    public int indexOf(Object item) { 
     for (int i = 0; i < size; i++){ 
      if (get(i).equals(item)){ 
       return i; 
      } 
     } 
     return -1; 
    } 

    @Override 
    public void add(int at, T item) { 
     if (at < 0 || at > size) 
      throw new ArrayIndexOutOfBoundsException(at); 
     for (int i = size; i > at; i--){ 
      myList[i] = myList [i-1]; 
     } 
//  myList[at] = item; 
     size++; 
    } 


    @Override 
    public T remove(int at) { 
     if (at < 0 || at >= size) 
      throw new ArrayIndexOutOfBoundsException(at); 
     T item = myList[at]; 
     for (int i = at; i<size-1; i++) 
      myList[i] = myList[i+1]; 
     size--; 
     return item; 
    } 

    @Override 
    public T max() { 
     T max = myList[0]; 
     for (int i = 1; i < myList.length; i++){ 
      if(myList[i].compareTo(max) == 1) 
       max = myList[i]; 
     } 
     return max; 
    } 

    @Override 
    public T min() { 
     T min = myList[0]; 
     for (int i = 1; i < size -1; i++){ 
      if (myList[i].compareTo(min) == -1) 
       min = myList[i]; 
     } 
     return min; 
    } 


} 

und der Fehler ist bei Public T max():

public T max() { 
T max = myList[0]; 
for (int i = 1; i < myList.length; i++){ 
    if(myList[i].compareTo(max) == 1) 
     max = myList[i]; 
} 
return max; 

}

Ich habe auch versucht mit ">", um sie zu vergleichen, aber das war auch nicht arbeiten. Es kann aufgrund des Datentypen sein, aber es ist kein Fehler in der IDE nur, wenn ich es zu laufen versuchen, und es verweist direkt auf diese Zeile in T max() {

if(myList[i].compareTo(max) == 1) 
+0

Schreiben Sie die Fehlermeldung bitte. – shmosel

+0

"Ausnahme im Thread" main "java.lang.NullPointerException \t bei myUtil.SimpleListAry.max (SimpleListAry.java:77)" Zeile 77 zeigt auf die Zeile myList.compareTo –

+0

Sie verwirren die Größe Ihrer Liste mit der Länge des zugrunde liegenden Arrays. – shmosel

Antwort

1

Drei Möglichkeiten des Null-Zeigers in if(myList[i].compareTo(max) == 1)

  1. myList - im Konstruktor initialisiert wird, nicht null
  2. myList[i] - Liste zunächst mit null gefüllt!
  3. max, je nachdem, wie compareTo implementiert wird - initialisiert myList[0] kann null sein, wenn die Liste leer

Der zweite Fall ist das Problem, da die Elemente des Ganzen sind zugrunde liegende Array ohne die reale Größe unter Berücksichtigung verglichenen der Liste.

Die Methode size() ist falsch, da sie die Variable size, die zurückgegeben wird, auf die Länge des Arrays setzt und den korrekten Wert überschreibt.

Entfernen Sie einfach die Zuweisung innerhalb der size() Methode (und verwenden Sie diese Methode in der Vergleichs-Schleife)

Verwandte Themen