2012-01-21 3 views
0

ブロックからツールを作成しました。コードに誤りはありませんでした。ビルドをクリックしようとすると、この端末エラーが発生します: どうすればこの問題を解決できますか?お願いします。ここで が実行時にEclipseを使用するMinecraftのModがエラーになる

package net.minecraft.src; 

public class RecipesTools 
{ 
    private String recipePatterns[][] = 
    { 
     { 
      "XXX", " # ", " # " 
     }, { 
      "X", "#", "#" 
     }, { 
      "XX", "X#", " #" 
     }, { 
      "XX", " #", " #" 
     } 
    }; 
    private Object recipeItems[][]; 

    public RecipesTools() 
    { 
     recipeItems = (new Object[][] 
       { 
        new Object[] { 
         Block.planks, Block.cobblestone, Item.ingotIron, Item.diamond, Item.ingotGold, Block.RadiatedStone 
        }, new Object[] { 
         Item.pickaxeWood, Item.pickaxeStone, Item.pickaxeSteel, Item.pickaxeDiamond, Item.pickaxeGold, Item.pickaxeRadiated 
        }, new Object[] { 
         Item.shovelWood, Item.shovelStone, Item.shovelSteel, Item.shovelDiamond, Item.shovelGold 
        }, new Object[] { 
         Item.axeWood, Item.axeStone, Item.axeSteel, Item.axeDiamond, Item.axeGold 
        }, new Object[] { 
         Item.hoeWood, Item.hoeStone, Item.hoeSteel, Item.hoeDiamond, Item.hoeGold 
        } 
       }); 
    } 

    public void addRecipes(CraftingManager craftingmanager) 
    { 
     for (int i = 0; i < recipeItems[0].length; i++) 
     { 
      Object obj = recipeItems[0][i]; 
      for (int j = 0; j < recipeItems.length - 1; j++) 
      { 
       Item item = (Item)recipeItems[j + 1][i]; 
       craftingmanager.addRecipe(new ItemStack(item), new Object[] 
         { 
          recipePatterns[j], Character.valueOf('#'), Item.stick, Character.valueOf('X'), obj 
         }); 
      } 
     } 

     craftingmanager.addRecipe(new ItemStack(Item.shears), new Object[] 
       { 
        " #", "# ", Character.valueOf('#'), Item.ingotIron 
       }); 
    } 
} 

EDIT RecipesTools.addRecipesためのコードである私も、RAMのEclipeの1024メガバイトを与え、私の.Minecraftフォルダを削除しました。

CONFLICT @ 22 
27 achievements 
Exception in thread "main" java.lang.ExceptionInInitializerError 
    at net.minecraft.src.StatList.initCraftableStats(StatList.java:74) 
    at net.minecraft.src.StatList.initBreakableStats(StatList.java:55) 
    at net.minecraft.src.Block.<clinit>(Block.java:975) 
    at net.minecraft.src.TextureWaterFX.<init>(TextureWaterFX.java:13) 
    at net.minecraft.client.Minecraft.<init>(Minecraft.java:205) 
    at net.minecraft.src.MinecraftImpl.<init>(MinecraftImpl.java:13) 
    at net.minecraft.client.Minecraft.startMainThread(Minecraft.java:1984) 
    at net.minecraft.client.Minecraft.startMainThread1(Minecraft.java:1970) 
    at net.minecraft.client.Minecraft.main(Minecraft.java:2032) 
    at Start.main(Start.java:25) 
Caused by: java.lang.ArrayIndexOutOfBoundsException: 5 
    at net.minecraft.src.RecipesTools.addRecipes(RecipesTools.java:44) 
    at net.minecraft.src.CraftingManager.<init>(CraftingManager.java:19) 
    at net.minecraft.src.CraftingManager.<clinit>(CraftingManager.java:8) 
    ... 10 more 

答えて

1

recipeItems[0].length 6.しかしrecipeItems[2]であり、次は唯一の5つの要素を持っています。あなたの最上位ループはaddRecipesだからそれは間違っています。

コレクションタイプ(ベクトル、リスト、Array、...)とイテレータを使用していると、コードをより安全で読みやすく(IMO)できるはずです。

+0

私は元のMinecraftコード – user1162004

+1

からこれをほとんど編集していません。クラスを編集して 'Strrrrring'を参照してもコンパイルできません。 –

+0

なぜ私のコレクションの種類が正しいのか説明しようとしていました。 – user1162004

0

addRecipiesの外側ループは、[0]の配列をrecipeItemsで繰り返しています。最初の子配列には、recipeItems[0][5]が有効な項目であることを意味する6つの要素があります。しかし、これはすべてのrecipeItems配列に当てはまるという誤った仮定があります。後の配列の少なくとも1つには6つ以下の要素があります。

最初の配列のサイズではなく、子配列のサイズを反復処理する必要があります。すべての

0

まず、あなたはおそらく、あなたがそれらをキャストする前に、ある配列にObject Sを入力する内容の確認する必要があり、その一部は、現在のループで

Item item = (Item)recipeItems[j + 1][i]; 

である、何かに置き換える必要がありますこのように:

Object itemObj = recipeItems[j + 1][i]; 
if(itemObj instanceof Item) 
{ 
    // The current element is an Item 
    Item item = (Item)recipeItems[j + 1][i]; 
    craftingmanager.addRecipe(new ItemStack(item), new Object[] 
    { 
     recipePatterns[j], Character.valueOf('#'), Item.stick, Character.valueOf('X'), obj 
    }); 
} 
else if(itemObj instanceof Block) 
{ 
    // The current element is a Block 
    Block block = (Block)recipeItems[j + 1][i]; 
    craftingmanager.addRecipe(new ItemStack(block), new Object[] 
    { 
     recipePatterns[j], Character.valueOf('#'), Item.stick, Character.valueOf('X'), obj 
    }); 
} 
else 
{ 
    // The current element is none of the types above 
    // TODO Throw an exception, print a message or quit the game 
} 

、ので、私はあなたがBlockItemをキャストすることはできません確信しています。以前に使用したコードが将来エラーを引き起こす可能性があるため、この問題は修正されません。

あなたの現在の問題を解決するには、マットnicholas.hauschildが既に答えたものです。 recipeItems配列(recipeItems[0]およびrecipeItems[1])の最初の2つの要素は6つの要素を持ちますが、残りの要素は5つの要素しか持っていません。あなたのループでは、最初の要素の長さだけを取り出し、それを使って残りの要素もループしますが、最初の要素よりも小さくなります。
5つの要素を持つ配列の要素6にアクセスしようとするとどうなりますか?

あなたはこのようなものでループを置き換えることができます:

for(int i = 0; i < recipeItems.length - 1; i++) 
{ 
    for(int j = 0; j < recipeItems[i].length; j++) 
    { 
     Object obj = recipeItems[0][j]; 
     Object itemObj = recipeItems[i + 1][j]; 
     if(itemObj instanceof Item) 
     { 
      // The current element is an Item 
      Item item = (Item)recipeItems[j + 1][i]; 
      craftingmanager.addRecipe(new ItemStack(item), new Object[] 
      { 
       recipePatterns[j], Character.valueOf('#'), Item.stick, Character.valueOf('X'), obj 
      }); 
     } 
     else if(itemObj instanceof Block) 
     { 
      // The current element is a Block 
      Block block = (Block)recipeItems[j + 1][i]; 
      craftingmanager.addRecipe(new ItemStack(block), new Object[] 
      { 
       recipePatterns[j], Character.valueOf('#'), Item.stick, Character.valueOf('X'), obj 
      }); 
     } 
     else 
     { 
      // The current element is none of the types above 
      // TODO Throw an exception, print a message or quit the game 
     } 
    } 
} 

は、この情報がお役に立てば幸い!

関連する問題