#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
используется для определения соответствия.