2011-04-19 69 views
1

我不斷收到一個ClassCastExceptionClassCastException異常在Java中

異常在線程 「主要」 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

請發佈堆棧跟蹤。並告訴我們跟蹤中的行號所代表的代碼行。 – QuantumMechanic 2011-04-19 23:58:19

+0

Ehm,目前尚不清楚,但在我看來,您對String鍵的生物類型列表執行二分搜索?我指的是Collections.binarySearch(array,commands [0]); – m0s 2011-04-20 00:12:03

回答

1

您有:

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

arrayCreature對象的列表。 commands[0]String對象。

你不能那樣做。它試圖將String投射到Creature,你會得到你的例外。

您必須提供Creature進行搜索,而不是String。您在Creature中的Comparable.compareTo()的實施用於確定匹配。

+0

好吧,我想我現在明白了錯誤。 – 2011-04-20 00:16:09

4

在你打電話binarySearch()關鍵是字符串,但應該是Creature類型。

從Javadoc文檔Collections.binarySearch()

public static int binarySearch(List list, 
           Object key) 

拋出:ClassCastException - 如果 列表包含不 相互比較的(例如, 字符串和整數)的元素,或者在沒有搜索 關鍵可與 列表中的元素相互媲美。