java中的ClassCastException

时间:2011-04-19 23:57:38

标签: java

我不断收到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;

}
}

2 个答案:

答案 0 :(得分:4)

在致电binarySearch()时,密钥为String,但类型为Creature

来自Collections.binarySearch()

的javadoc
public static int binarySearch(List list,
                               Object key)
  

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

答案 1 :(得分:1)

你有:

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

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

你做不到。它会尝试将String投射到Creature并获得您的例外。

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