ClassCastException в java

#java

#java

Вопрос:

Я продолжаю получать ClassCastException

Исключение в потоке «main» java.lang.ClassCastException: java.lang.Строка не может быть приведена к homework5.Creature

 at ho.Creature.compareTo(Creature.java:11)
at java.util.Collections.indexedBinarySearch(Collections.java:215)
at java.util.Collections.binarySearch(Collections.java:201)
at ho.PC.play(PC.java:61)
at ho.Main.main(Main.java:41)
  

Результат Java: 1

Я не уверен, что еще мне нужно предоставить для получения информации

Метод, который я должен запустить:

 public void play(PC pc) {
        Scanner reader = new Scanner(System.in);
        while (true) {
            String command = reader.nextLine();
            String[] commands = null;
            if (command.contains(":")) {
                commands = command.split(":");
                ArrayList array = getRoom().getCreatures();
                Collections.sort(array);
                int index = Collections.binarySearch(array, commands[0]);
                Creature c = getRoom().getCreatures().get(index);
                //Creature c = getRoom().binarySearchForCreature(commands[0], 0, getRoom().getCount() - 1);
                if (c != null) {
                    if (commands[1].equalsIgnoreCase("clean")) {
                        c.clean(pc);
                        pc.getRoom().critReactRoomStateChange("clean", pc, c.getName());
                    } else if (commands[1].equalsIgnoreCase("dirty")) {
                        c.dirty(pc);
                        pc.getRoom().critReactRoomStateChange("dirty", pc, c.getName());
                    } else if (commands[1].equalsIgnoreCase("n")) {
                        c.tryMove(commands[1], pc);
                        c.checkNewRoom();
                    } else if (commands[1].equalsIgnoreCase("e")) {
                        c.tryMove(commands[1], pc);
                        c.checkNewRoom();
                    } else if (commands[1].equalsIgnoreCase("s")) {
                        c.tryMove(commands[1], pc);
                        c.checkNewRoom();
                    } else if (commands[1].equalsIgnoreCase("w")) {
                        c.tryMove(commands[1], pc);
                        c.checkNewRoom();
                    } else {
                        System.out.println("Command Does not exist.");
                    }
                } else {
                    System.out.println("That creature is not in the room.");
                } ...(Keeps going)
  

После того, как я внедрил Collections.BinarySearch, я начал получать эту ошибку
Я получаю ошибку в моем классе creature.
Это класс, из которого возникает основная ошибка
ho.Creature.compareTo(Creature.java:11) Значение сравнения находится в самом низу.

 public abstract class Creature implements Comparable<Creature> {

protected Room roomRef;
private String name;
private String descript;

public Creature(String name, String descript) {
    this.name = name;
    this.descript = descript;
}

public void setRoom(Room roomRef) {
    this.roomRef = roomRef;
}

public Room getRoom() {
    return this.roomRef;

}

public String getName() {
    return this.name;
}

public void setName(String name) {
    this.name = name;
}

public final void clean(PC pc) {
    String cClass = "";

    if (!getRoom().getState().equalsIgnoreCase("clean")) {
        if (getRoom().getState().equalsIgnoreCase("dirty")) {
            getRoom().setState("half-dirty");
        } else {
            getRoom().getState().equalsIgnoreCase("half-dirty");
            getRoom().setState("clean");
        }
        if (this instanceof Animal) {
            cClass = "Animal";
            System.out.println(getName()   " the "   cClass   " cleans the room "   roomRef.getName()   ". The room's state is now "   roomRef.getState());
            reactG(pc);
            reactG(pc);
            reactG(pc);
        }
        if (this instanceof NPC) {
            cClass = "NPC";
            System.out.println(getName()   " the "   cClass   " cleans the room "   roomRef.getName()   ". The room's state is now "   roomRef.getState());
            reactD(pc);
            reactD(pc);
            reactD(pc);
        }
        if (this instanceof PC) {
            cClass = "PC";
        }

    } else {
        System.out.println("The room "   roomRef.getName()   "is already clean.");
    }
}

public final void dirty(PC pc) {
    String cClass = "";
    if (!getRoom().getState().equalsIgnoreCase("dirty")) {
        if (getRoom().getState().equalsIgnoreCase("clean")) {
            getRoom().setState("half-dirty");
        } else {
            getRoom().getState().equalsIgnoreCase("half-drity");
            getRoom().setState("dirty");
        }
        if (this instanceof Animal) {
            cClass = "Animal";
            System.out.println(getName()   " the "   cClass   " dirties the room "   roomRef.getName()   ". The room's state is now "   roomRef.getState());
            reactD(pc);
            reactD(pc);
            reactD(pc);
        }
        if (this instanceof NPC) {
            cClass = "NPC";
            System.out.println(getName()   " the "   cClass   " dirties the room "   roomRef.getName()   ". The room's state is now "   roomRef.getState());
            reactG(pc);
            reactG(pc);
            reactG(pc);
        }
        if (this instanceof PC) {
            cClass = "PC";
            System.out.println(getName()   " the "   cClass   " dirties the room "   roomRef.getName()   ". The room's state is now "   roomRef.getState());
        }

    } else {
        System.out.println("The room "   roomRef.getName()   "is already dirty.");
    }

}

public String getCreatureType() {
    if ((this instanceof PC)) {
        return "PC";
    }
    if ((this instanceof NPC)) {
        return "NPC";
    }
    if ((this instanceof Animal)) {
        return "Animal";
    }
    return null;
}

public void reactStateChange(String command, PC pc) {
    if ((this instanceof NPC)) {
        if (command.equals("clean")) {
            reactD(pc);
        }
        if (command.equals("dirty")) {
            reactG(pc);
        }
        if (this.roomRef.getState().equalsIgnoreCase("clean")) {
            tryLeaveRoom(pc);
        }
    }
    if (this instanceof Animal) {
        if (command.equalsIgnoreCase("clean")) {
            reactG(pc);
        }
        if (command.equals("dirty")) {
            reactD(pc);
        }
        if (this.roomRef.getState().equalsIgnoreCase("dirty")) {
            tryLeaveRoom(pc);
        }
    }
}

public void checkNewRoom() {
    if ((this instanceof NPC)) {

        if (this.roomRef.getState().equalsIgnoreCase("clean")) {
            this.roomRef.setState("half-dirty");
        }
    }
    if (this instanceof Animal) {

        if (this.roomRef.getState().equalsIgnoreCase("dirty")) {
            this.roomRef.setState("half-dirty");
        }
    }
}

public void tryMove(String direction, PC pc) {
    try {
        Room dest = getRoom().getNeighbor(direction);
        if (dest.getCreatures().size() <= 9) {
            getRoom().removeCreature(this);
            setRoom(getRoom().getNeighbor(direction));
            dest.addCreature(this);

            System.out.println("The "
                      getCreatureType()   " "
                      getName()   " left the room and goes to "
                      dest.getName()   " through the "
                      changeDirectionName(direction)   " door.");
        } else {
            System.out.println("Cannot move "
                      changeDirectionName(direction)
                      " to the room "   getRoom().getNeighbor(direction).getName()
                      " because it is full!");
            reactD(pc);
        }
    } catch (NullPointerException e) {
        System.out.println("There is not a neighbor to the "   changeDirectionName(direction)   "!");
        reactD(pc);
    }
}

private String changeDirectionName(String ref) {
    if (ref.equalsIgnoreCase("n")) {
        ref = "north";
        return ref;
    }
    if (ref.equalsIgnoreCase("s")) {
        ref = "south";
        return ref;
    }
    if (ref.equalsIgnoreCase("e")) {
        ref = "east";
        return ref;
    }
    if (ref.equalsIgnoreCase("w")) {
        ref = "west";
        return ref;
    }
    return null;
}

public void tryLeaveRoom(PC pc) {
    boolean allChosen = false;
    boolean[] chosen = new boolean[4];
    while (allChosen == false) {
        String[] directions = {"n", "e", "s", "w"};
        Random dirPick = new Random();
        int rNum = dirPick.nextInt(4);
        String direction = directions[rNum];
        Room destRoom = getRoom().getNeighbor(direction);
        if (chosen[rNum] == false) {
            if (destRoom != null) {
                tryMove(direction, pc);
                break;
            }
            chosen[rNum] = true;
        }
        if (chosen[0] == true amp;amp; chosen[1] == true amp;amp; chosen[2] == true amp;amp; chosen[3] == true) {
            allChosen = true;
            getRoom().removeCreature(this);
            getRoom().roofAction(pc);
            System.out.println("The "   getCreatureType()   " "   getName()   "leaves through the roof of "   getRoom().getName());
        }
    }
}

protected abstract void reactRoom(PC pc);

protected abstract void reactG(PC pc);

protected abstract void reactD(PC pc);

public void look() {
    String creatureS = "";
    System.out.print("The name of the room you are in is "   roomRef.getName()   ".  ");
    System.out.print("nDescription: "   roomRef.getDescription()   " ");
    System.out.print("and it's state is "   roomRef.getState()   ".n");
    System.out.print("It contains the creatures: n");
    for (int i = 0; i < roomRef.getCreatures().size(); i  ) {
            creatureS  = "t"   roomRef.getCreatures().get(i).getName()  "n";
    }
//        for (int i = 0; i < roomRef.getCreatures().length; i  ) {
//            if (this.roomRef.getCreatures()[i] != null) {
//                creatureS  = "t"   roomRef.getCreatures()[i]   "n";
//            }
//        }
    System.out.println(creatureS);
    System.out.print("Neighbors:n");
    if (this.roomRef.getNeighbor("n") != null) {
        System.out.print("tThe north door is: "   this.roomRef.getNorthD().getName()   "n");
    } else {
        System.out.print("");
    }

    if (this.roomRef.getNeighbor("s") != null) {
        System.out.print("tThe south door is: "   this.roomRef.getSouthD().getName()   "n");
    } else {
        System.out.print("");
    }

    if (this.roomRef.getNeighbor("e") != null) {
        System.out.print("tThe east door is: "   this.roomRef.getEastD().getName()   "n");
    } else {
        System.out.print("");
    }

    if (this.roomRef.getNeighbor("w") != null) {
        System.out.print("tThe west door is: "   this.roomRef.getWestD().getName()   "n");
    } else {
        System.out.print("");
    }
}

public int compareTo(Creature o) {
    return this.getName().compareToIgnoreCase(o.getName());
}

public String toString() {
    return name   " is a/an "   this.getCreatureType()   " who is "   descript;

}
}
  

Комментарии:

1. Опубликуйте трассировку стека, пожалуйста. И скажите нам, к каким строкам кода относятся номера строк в трассировке.

2. Эмм, это непонятно, но мне кажется, что вы выполняете двоичный поиск по списку типа существа по ключу String? Я имею в виду коллекции строк.BinarySearch(массив, команды [0]);

Ответ №1:

При вызове к binarySearch() ключ является строковым, но должен иметь тип Creature .

Из javadoc для коллекций.BinarySearch()

 public static int binarySearch(List list,
                               Object key)
  

Выдает: ClassCastException — если
список содержит элементы, которые не
взаимно сопоставимые (например,
строки и целые числа), или поиск
ключ в не сопоставим между собой с
элементы списка.

Ответ №2:

У вас есть:

 int index = Collections.binarySearch(array, commands[0]);
  

array представляет собой список Creature объектов. commands[0] является String объектом.

Вы не можете этого сделать. Он пытается привести String к Creature , и вы получаете свое исключение.

Вы должны указать Creature для поиска, а не a String . Ваша реализация Comparable.compareTo() в Creature используется для определения соответствия.