0

我用一个没有代码错误的块制作了一个工具。当我尝试单击构建时,它给了我这个终端错误:我该如何解决这个问题?请。这是 RecipesTools.addRecipes 的代码

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
                });
    }
}

编辑 我还给了 Ecipe 1024mb 的 RAM 并删除了我的 .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
4

3 回答 3

1

recipeItems[0].length是6。但是recipeItems[2]和下面只有五个元素。因此,您在其中的顶层循环是addRecipes错误的。

您可能应该为此使用集合类型(向量、列表、Array...)和迭代器,这将使代码更安全、更易读(IMO)。

于 2012-01-21T07:53:52.903 回答
0

您的外部循环 inaddRecipies正在遍历[0]. recipeItems在第一个子数组中,有 6 个元素意味着这recipeItems[0][5]将是一个有效的项目。但是有一个不正确的假设,即这对所有recipeItems数组都是正确的。后面的数组中至少有一个少于 6 个元素。

您应该迭代子数组的大小而不是第一个数组的大小。

于 2012-01-21T08:03:11.260 回答
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
}

因为,我很确定您不能将 anItem转换为Block. 这不会解决这个问题,这只是一个提示,因为您之前使用的代码将来可能会导致错误。

您当前问题的解决方案是Matnicholas.hauschild已经回答的问题。recipeItems数组的前两个元素(recipeItems[0]recipeItems[1]) 有 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
        }
    }
}

希望这可以帮助!

于 2015-02-22T11:59:52.097 回答