Помогите Ошибка в крафте из-за воздуха

Статус
Закрыто для дальнейших ответов.

Energy warrior

Активный участник
Пользователь
Баллы
76
Я переделал либу @alexandrage на крафты, чтобы вместо массивов юзать хэшкарту. Когда все предметы имеют обозначение и у них есть предмет всё нормально, но стоит мне только добавить воздух как мне начинает вылетать NPE. Что мне сделать чтобы это исправить. P.s на прежнюю версию я не хочу пересаживаться, ну или хотя бы узнаю в чём ошибка была.
Код:
public static void addRecipe(ItemStack stack, String[] shape, HashMap<Character, ItemStack> ingredients) {
        Plugin plugin = Plugin.getPlugin();
        if (stack == null) {
            throw new IllegalArgumentException("Result cannot be null.");
        }
        ShapedRecipe rc = new ShapedRecipe(new NamespacedKey(plugin, UUID.randomUUID().toString()), stack);
        rc.shape(shape);
        Craft cr = new Craft();
        cr.add(stack);
        ingredients.forEach((c,i)-> rc.setIngredient(c,i.getType()));
        String shape_string = shape[0]+shape[1]+shape[2];
        for (char c:shape_string.toCharArray()) {
            if(c == ' '){
                cr.add(new ItemStack(Material.AIR));
            }
            cr.add(ingredients.get(c));
        }
        for (ItemStack itemStack : cr.stacks) {
            System.out.println(itemStack.getType());
        }
        Bukkit.getServer().addRecipe(rc);
        craft.put(rc.getKey().getKey(), cr);
    }
 
Я переделал либу @alexandrage на крафты, чтобы вместо массивов юзать хэшкарту. Когда все предметы имеют обозначение и у них есть предмет всё нормально, но стоит мне только добавить воздух как мне начинает вылетать NPE. Что мне сделать чтобы это исправить. P.s на прежнюю версию я не хочу пересаживаться, ну или хотя бы узнаю в чём ошибка была.
Код:
public static void addRecipe(ItemStack stack, String[] shape, HashMap<Character, ItemStack> ingredients) {
        Plugin plugin = Plugin.getPlugin();
        if (stack == null) {
            throw new IllegalArgumentException("Result cannot be null.");
        }
        ShapedRecipe rc = new ShapedRecipe(new NamespacedKey(plugin, UUID.randomUUID().toString()), stack);
        rc.shape(shape);
        Craft cr = new Craft();
        cr.add(stack);
        ingredients.forEach((c,i)-> rc.setIngredient(c,i.getType()));
        String shape_string = shape[0]+shape[1]+shape[2];
        for (char c:shape_string.toCharArray()) {
            if(c == ' '){
                cr.add(new ItemStack(null));
            }
            cr.add(ingredients.get(c));
        }
        for (ItemStack itemStack : cr.stacks) {
            System.out.println(itemStack.getType());
        }
        Bukkit.getServer().addRecipe(rc);
        craft.put(rc.getKey().getKey(), cr);
    }
Нужно добавлять не air, а null
Код:
public static void addRecipe(ItemStack stack, String[] shape, HashMap<Character, ItemStack> ingredients) {
        Plugin plugin = Plugin.getPlugin();
        if (stack == null) {
            throw new IllegalArgumentException("Result cannot be null.");
        }
        ShapedRecipe rc = new ShapedRecipe(new NamespacedKey(plugin, UUID.randomUUID().toString()), stack);
        rc.shape(shape);
        Craft cr = new Craft();
        cr.add(stack);
        ingredients.forEach((c,i)-> rc.setIngredient(c,i.getType()));
        String shape_string = shape[0]+shape[1]+shape[2];
        for (char c:shape_string.toCharArray()) {
            if(c == ' '){
                cr.add(new ItemStack(null));
            }
            cr.add(ingredients.get(c));
        }
        for (ItemStack itemStack : cr.stacks) {
            System.out.println(itemStack.getType());
        }
        Bukkit.getServer().addRecipe(rc);
        craft.put(rc.getKey().getKey(), cr);
 
Последнее редактирование:
Что то я не понял смысла в этом. Тупо загадил мой метод addRecipe 3мя циклами вместо одного, смысл?
Смысл в том, что мне не удобно миллиард раз писать одно и тоже в массиве. А тут вставляешь карту пишешь расположение и усё. Ну и надо же учиться чемунить. А то если я буду изать либы, которые мне дали, не переделывая под себя, я и не научись ничему. Хз может я и наоборот усложнил. Ну тогда это носит чисто образовательный смысл.)
 
Нужно добавлять не air, а null
Код:
public static void addRecipe(ItemStack stack, String[] shape, HashMap<Character, ItemStack> ingredients) {
        Plugin plugin = Plugin.getPlugin();
        if (stack == null) {
            throw new IllegalArgumentException("Result cannot be null.");
        }
        ShapedRecipe rc = new ShapedRecipe(new NamespacedKey(plugin, UUID.randomUUID().toString()), stack);
        rc.shape(shape);
        Craft cr = new Craft();
        cr.add(stack);
        ingredients.forEach((c,i)-> rc.setIngredient(c,i.getType()));
        String shape_string = shape[0]+shape[1]+shape[2];
        for (char c:shape_string.toCharArray()) {
            if(c == ' '){
                cr.add(new ItemStack(null));
            }
            cr.add(ingredients.get(c));
        }
        for (ItemStack itemStack : cr.stacks) {
            System.out.println(itemStack.getType());
        }
        Bukkit.getServer().addRecipe(rc);
        craft.put(rc.getKey().getKey(), cr);
Код:
Error occurred while enabling TestPlugin v0.1 (Is it up to date?)
java.lang.IllegalArgumentException: Material cannot be null
        at org.apache.commons.lang.Validate.notNull(Validate.java:192) ~[spigot.jar:git-Spigot-f56e2e7-7fc66b2]
        at org.*********ventory.ItemStack.<init>(ItemStack.java:69) ~[spigot.jar:git-Spigot-f56e2e7-7fc66b2]
        at org.*********ventory.ItemStack.<init>(ItemStack.java:57) ~[spigot.jar:git-Spigot-f56e2e7-7fc66b2]
        at org.*********ventory.ItemStack.<init>(ItemStack.java:45) ~[spigot.jar:git-Spigot-f56e2e7-7fc66b2]
        at org.*********ventory.ItemStack.<init>(ItemStack.java:35) ~[spigot.jar:git-Spigot-f56e2e7-7fc66b2]
        at ru.pack.plugin.utils.crafts.Recipe.addRecipe(Recipe.java:32) ~[?:?]
        at ru.pack.plugin.Plugin.registerCrafts(Plugin.java:70) ~[?:?]
        at ru.pack.plugin.Plugin.onEnable(Plugin.java:41) ~[?:?]
        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:254) ~[spigot.jar:git-Spigot-f56e2e7-7fc66b2]
        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:340) [spigot.jar:git-Spigot-f56e2e7-7fc66b2]

UPD: После дебага выяснилось, что в итерации, когда встречается воздух, его добавляет а потом выбрасывает NPE
 
Последнее редактирование:
Проблема решена! Оказалось что я во время цикла не после проверки на знак ' ' он не переходил к следующему символу, а выходил из проверки и пытался достать из хэшмапы этот символ. Нужно было просто дописать continue.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх