【问题标题】:ClassCastException in javajava中的ClassCastException
【发布时间】:2025-06-25 03:05:01
【问题描述】:

我不断收到 ClassCastException

线程“main”java.lang.ClassCastException 中的异常:java.lang.String 无法转换为 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 后,我开始收到此错误 我在我的生物类中得到错误。 这是*错误来自的类 ho.Creature.compareTo(Creature.java:11) compareTo 接近底部。

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 && chosen[1] == true && chosen[2] == true && 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;

}
}

【问题讨论】:

  • 请发布堆栈跟踪。并告诉我们跟踪中的行号所指的代码行。
  • 嗯,目前尚不清楚,但在我看来,您对字符串键的 Creature 类型列表执行二进制搜索?我指的是 Collections.binarySearch(array, commands[0]);

标签: java


【解决方案1】:

在您调用binarySearch() 时,键是字符串,但应该是Creature 类型。

来自Collections.binarySearch()的javadoc

public static int binarySearch(List list,
                               Object key)

抛出:ClassCastException - 如果 列表包含不属于 相互比较(例如, 字符串和整数),或搜索 键入不可相互比较 列表的元素。

【讨论】:

    【解决方案2】:

    你有:

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

    arrayCreature 对象的列表。 commands[0] 是一个 String 对象。

    你不能那样做。它会尝试将 String 转换为 Creature 并且您会遇到异常。

    您必须为搜索提供Creature,而不是String。您在Creature 中的Comparable.compareTo() 实现用于确定匹配。

    【讨论】: