私の場合はBlock
を返す関数を持っています。 blockName
という名前の文字列を使用していますが、その値は「汚れ」に設定されます。 その後、blockNameConverted
という名前の新しい文字列を作成しています。これはBlockDirt
になり、私はまた、クラスBlockDirt
を持っている(それは同じパッケージではありません):特定のクラスを検索して返します
clas = Class.forName(blockNameConverted);
クラス
BlockDirt
を検索すべきだと思う
public Block getBlockFromId(int id){
String blockName = iBlockRegistry.getStrintFromId(id).getStringValue(); // Yeah i know.. it's Strint :D
String blockNameConverted = "Block" + blockName.substring(0, 1).toUpperCase() + blockName.substring(1); //Capitalize the d of dirt
debug.Log("Blockname: " + blockName); //Outputs in Console "Blockname: dirt"
debug.Log("Converted Blockname: " + blockNameConverted); //Outputs in Console "Converted Blockname: BlockDirt"
Class<?> clas;
try {
clas = Class.forName(blockNameConverted);
} catch (ClassNotFoundException e) {
clas = BlockDirt.class.getClass(); //If class not found use this class as "default"
e.printStackTrace();
}
Block blockClass = Block.class.cast(clas);
return blockClass;
}
しかし、私はこのエラーを取得しています。このメソッドを呼び出すとき
java.lang.ClassNotFoundException: BlockDirt
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at registry.MinecraftRegistry.getBlockFromId(MinecraftRegistry.java:39)
at registry.BlockRegistry.register(BlockRegistry.java:11)
at block.Block.registerBlock(Block.java:21)
at engineTester.MainGameLoop.main(MainGameLoop.java:126)
もこの:
Exception in thread "main" java.lang.ClassCastException: Cannot cast java.lang.Class to block.Block
at java.lang.Class.cast(Unknown Source)
at registry.MinecraftRegistry.getBlockFromId(MinecraftRegistry.java:44)
at registry.BlockRegistry.register(BlockRegistry.java:11)
at block.Block.registerBlock(Block.java:21)
at engineTester.MainGameLoop.main(MainGameLoop.java:126)
私が間違って何をしているのですか?
クラスを検索して返す(または使用する)方法を知りたいので、私は完全なクラスを投稿していません。 Block blockClass = Block.class.cast(clas);
で
私はBlock blockClass = new BlockDirt();
と同じ結果のように取得したいが、後に、私はまた、他のブロックを作成したいとたびBlockDirt
のIDを取得したいいけないので、私は私のコードでこれを直接入力するカント。
私は英語は私の母国語ではないので、あなたが私を理解することを願って:D
あなたはそのクラス自体をブロックにキャストしています。これはブロックではありません。 'clas.newInstance()'を使ってクラスの新しいインスタンスを作成します。 – Moira
最初の例外は単に、コードを実行するJVMのクラスパスでBlockDirtクラスが** not **であることを意味します。 – GhostCat
2つの異なるエラー、2つの別々の問題:1) 'ClassNotFoundException':あなたのクラスパスが間違っている、そして/またはあなたが正しいクラス名を指定していない、2)' ClassCastException':* CLASS INSTANCE OF BLOCK * "Class"オブジェクトではない – paulsm4