2016-12-02 1 views
2

Ich habe diese Methode definiert:java.lang.ClassCastException; kein Stacktrace mit TreeSet <ItemStack>

public static TreeSet<ItemStack> getItems() { 
    TreeSet<ItemStack> things = new TreeSet<>(); 
    things.add(new ItemStack(Material.ACACIA_DOOR)); 
    return things; 
} 

Ich habe auch versucht, mehrere Dinge in der TreeSet setzen, es funktioniert auch nicht.

Jetzt habe ich diesen Code Teil:

TreeSet<ItemStack> things = getItems(); 

Wenn ich das laufen, passiert nichts. Wenn ich es mit try/catch umgebe, scheint eine Ausnahme ausgelöst zu werden. Aber wenn ich drucken Sie den Fehler wie folgt aus:

} catch (Exception exc) { 
    System.out.println("Catched an exception:") 
    exc.printStackTrace(); 
    System.out.println(exc.getMessage()); 
    System.out.println(exc); 
} 

Es gibt keine Fehler/Stacktrace oder so kommen. Er sagt nur:

[INFO]: Catched an exception: 
[WARN]: java.lang.ClassCastException 
[INFO]: null 
[INFO]: java.lang.ClassCastException 

Also, was der Fehler ist, wie verhindere ich es und warum ich es durch einen TreeSet mit itemsets zu einem TreeSet mit itemsets Gießen?

+2

Implementiert 'ItemStack' 'Comparable '? Ich rate es nicht. –

+0

@AndyTurner ich denke, es nicht: public class ItemStack Objekt implementiert klonbar, ConfigurationSerializable – writzlpfrimpft

+0

rechts erstreckt, es funktioniert nicht. Beachten Sie, dass "extends Object" ebenfalls unnötig ist. –

Antwort

0

Read the Javadoc.

Auch wenn Sie nicht wissen, wonach Sie suchen, drücken Sie Ctrl-f, und suchen Sie nach ClassCastException auf der Seite. In der Dokumentation des Konstrukteurs Sie verwenden, TreeSet(), werden Sie feststellen:

Alle in den Satz eingefügten Elemente müssen die Comparable-Schnittstelle implementieren. ... Wenn der Benutzer versucht, dem Satz, der gegen diese Einschränkung verstößt, ein Element hinzuzufügen ..., wird durch den Aufruf von add ein ClassCastException ausgelöst.

Also, entweder:

  • Ihre ItemStackComparable<ItemStack> implementieren machen.
  • Geben Sie dem Konstruktor Comparator<ItemStack> eine TreeSet.
0

The docs, denke ich vielleicht das Problem ist, dass das Element von TreeSetComparable oder verlängern ‚Vergleicher‘ implments sollte. Hoffe es kann dir helfen.

1

Was Sie tun können, um Ihre Situation zu lösen, und damit Ihre gewünschte Verhalten eine normale Liste anstelle eines TreeSet ist die Gewährleistung Ihre Einzelteile zu speichern:

ArrayList<ItemStack> items = new ArrayList<ItemStack>(); 
items.add(new ItemStack(Material.GRASS); 
items.add(new ItemStack(Material.DIRT); 
//Items is now a list with 2 ItemStacks inside 

for (ItemStack is : items) { 
    //Do something 
} 

Auf diese Weise beheben Sie das Problem. Treeset sollte verwendet werden, wenn Sie eine bestimmte Ordinierung für Ihre Objekte wünschen und ItemStacks nicht normal bestellt werden können.