2016-12-02 6 views
2

У меня этот метод определен:java.lang.ClassCastException; нет StackTrace с TreeSet <ItemStack>

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

Я также попытался положить несколько вещей в TreeSet, он не работает.

Теперь у меня есть эта часть кода:

TreeSet<ItemStack> things = getItems(); 

Если я запускаю это, ничего не происходит. Если я окружаю его с помощью try/catch, кажется, что есть исключение. Но если я печатаю ошибку так:

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

Существует не ошибка/StackTrace или так подходит. Он просто говорит:

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

Так что ошибка, как предотвратить это, и почему я его отливку TreeSet с наборами к TreeSet с наборами?

+2

Использует ли 'ItemStack'' Comparable '? Я собираюсь догадаться, что нет. –

+0

@AndyTurner Я думаю, что это не так: Публичный класс ItemStack extends Объект Наборы для клонирования, конфигурацияSerializable – writzlpfrimpft

+0

Правильно, это не так. Обратите внимание, что 'extends Object' также не требуется. –

ответ

0

Read the Javadoc.

Даже если вы не знаете, что искали, нажмите Ctrl-f и найдите ClassCastException на странице. В документации конструктора, который вы используете, TreeSet(), вы найдете:

Все элементы, вставленные в наборе должны реализовывать интерфейс Comparable. ... Если пользователь пытается добавить элемент в набор, который нарушает это ограничение ..., вызов add вызовет ClassCastException.

Так, как:

  • сделать ваш ItemStack реализовать Comparable<ItemStack>.
  • Предоставьте Comparator<ItemStack> конструктору TreeSet.
0

The docs, я думаю, может быть, проблема в том, что элемент TreeSet должен implments Comparable или продлить «компаратор». Надеюсь, это поможет тебе.

1

Что вы можете сделать, чтобы решить вашу ситуацию, и, таким образом, гарантируя ваше предназначенное поведение, используя обычный список вместо TreeSet для хранения вещей:

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 
} 

Таким образом, вы устранить проблему. Treeset следует использовать, если вам нужен определенный орден на ваших элементах, а ItemStacks не может быть заказан нормально.