开发者

ClassCastException in java

I keep getting a ClassCastException

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to 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 Result: 1

I'm not sure what else I need to give for information

Method I have to start things:

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)

After I implemented the Collections.binarySearch I started getting this error I get the error in my creature class. This is the class the top error comes from ho.Creature.compareTo(Creature.java:11) The compareTo is near the bottom.

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")) {
        r开发者_C百科ef = "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;

}
}


In you call to binarySearch() the key is String but should be of type Creature.

From javadoc for Collections.binarySearch()

public static int binarySearch(List list,
                               Object key)

Throws: ClassCastException - if the list contains elements that are not mutually comparable (for example, strings and integers), or the search key in not mutually comparable with the elements of the list.


You have:

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

array is a list of Creature objects. commands[0] is a String object.

You can't do that. It tries to cast String to Creature and you get your exception.

You must supply a Creature to the search, not a String. Your implementation of Comparable.compareTo() in Creature is used to determine a match.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜