[Решено] Краш в GUI, если нажать по пустому месту.

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

Lisenochek

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Lisenochek
Всем привет. Писал я GUI интерфейс, вроде все отлично работает, но если нажать в меню по пустому месту - выдает краш. Делал доп.проверки - но толку ноль. Что я делаю не так?

Код самого GUI интерфейса:
Код:
package com.realistic.guilist;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.*********ventory.Inventory;

import com.realistic.list.GUI_List;

import net.md_5.bungee.api.ChatColor;

public class GUI_mechanic implements Listener {

    public static void openGUI(Player p) {

        Inventory inv = Bukkit.createInventory(null, 45, ChatColor.BLUE + "Список крафтов вещей");

        inv.setItem(0, GUI_List.create(Material.STICK, 1, (byte) 0, ChatColor.GOLD + "Крафт некачественного материала.",
                ChatColor.BLUE + "--------------------------------------------------------------------",
                ChatColor.GREEN + "Для создания предмета,",
                ChatColor.GREEN + "сложите рецепт так, как показано в меню.",
                ChatColor.GREEN + "Необходимо: " + ChatColor.RED + "Обрубки от дерева" + ChatColor.GREEN + ".",
                ChatColor.BLUE + "--------------------------------------------------------------------"));
      
        inv.setItem(1, GUI_List.create(Material.STICK, 1, (byte) 0, ChatColor.GOLD + "Крафт некачественного материала.",
                ChatColor.BLUE + "--------------------------------------------------------------------",
                ChatColor.GREEN + "Для создания предмета,",
                ChatColor.GREEN + "сложите рецепт так, как показано в меню.",
                ChatColor.GREEN + "Необходимо: " + ChatColor.RED + "Обрубки от дерева" + ChatColor.GREEN + ".",
                ChatColor.BLUE + "--------------------------------------------------------------------"));
      
        inv.setItem(9, GUI_List.create(Material.STICK, 1, (byte) 0, ChatColor.GOLD + "Крафт некачественного материала.",
                ChatColor.BLUE + "--------------------------------------------------------------------",
                ChatColor.GREEN + "Для создания предмета,",
                ChatColor.GREEN + "сложите рецепт так, как показано в меню.",
                ChatColor.GREEN + "Необходимо: " + ChatColor.RED + "Обрубки от дерева" + ChatColor.GREEN + ".",
                ChatColor.BLUE + "--------------------------------------------------------------------"));
      
        inv.setItem(10, GUI_List.create(Material.STICK, 1, (byte) 0, ChatColor.GOLD + "Крафт некачественного материала.",
                ChatColor.BLUE + "--------------------------------------------------------------------",
                ChatColor.GREEN + "Для создания предмета,",
                ChatColor.GREEN + "сложите рецепт так, как показано в меню.",
                ChatColor.GREEN + "Необходимо: " + ChatColor.RED + "Обрубки от дерева" + ChatColor.GREEN + ".",
                ChatColor.BLUE + "--------------------------------------------------------------------"));

      
      
        inv.setItem(39, GUI_List.create(Material.BARRIER, ChatColor.RED + "Закрыть помощь крафт вещей."));
        inv.setItem(41, GUI_List.create(Material.SIGN, ChatColor.GREEN + "Перейти на страницу помощи по выживанию."));
        inv.setItem(40, GUI_List.create(Material.SIGN, ChatColor.GREEN + "Перейти на страницу крафтов медикаментов."));

        inv.setItem(38, GUI_List.create(Material.STAINED_GLASS_PANE, 1, (byte) 4, " "));
        inv.setItem(42, GUI_List.create(Material.STAINED_GLASS_PANE, 1, (byte) 4, " "));

        inv.setItem(29, GUI_List.create(Material.STAINED_GLASS_PANE, 1, (byte) 5, " "));
        inv.setItem(30, GUI_List.create(Material.STAINED_GLASS_PANE, 1, (byte) 4, " "));
        inv.setItem(31, GUI_List.create(Material.STAINED_GLASS_PANE, 1, (byte) 5, " "));
        inv.setItem(32, GUI_List.create(Material.STAINED_GLASS_PANE, 1, (byte) 4, " "));
        inv.setItem(33, GUI_List.create(Material.STAINED_GLASS_PANE, 1, (byte) 5, " "));

        p.openInventory(inv);
    }
}

Код API
Код:
package com.realistic.list;

import java.util.ArrayList;

import org.bukkit.Material;
import org.*********ventory.ItemStack;
import org.*********ventory.meta.ItemMeta;

public class GUI_List {

    public static ItemStack create(Material material, int amount, byte metadata, String name, String lore1,
            String lore2, String lore3, String lore4, String lore5) {

        ItemStack item = new ItemStack(material, amount, metadata);
        ItemMeta meta = item.getItemMeta();

        if (name != null) {
            meta.setDisplayName(name);
        }

        ArrayList<String> lore = new ArrayList<String>();

        if (lore1 != null) {
            lore.add(lore1);
        }
        if (lore2 != null) {
            lore.add(lore2);
        }
        if (lore3 != null) {
            lore.add(lore3);
        }
        if (lore4 != null) {
            lore.add(lore4);
        }
        if (lore5 != null) {
            lore.add(lore5);
        }
        meta.setLore(lore);
        item.setItemMeta(meta);

        return item;
    }

    public static ItemStack create(Material material, String name) {

        return create(material, 1, (byte) 0, name, null, null, null, null, null);
    }

    public static ItemStack create(Material material, int amount, byte metadata, String name) {

        return create(material, amount, metadata, name, null, null, null, null, null);
    }
}

Сам краш:
Код:
19:57:26 ERROR]: Could not pass event InventoryClickEvent to Realistic v1.4 beta
org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [server.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:1630) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PacketPlayInWindowClick.a(SourceFile:31) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PacketPlayInWindowClick.a(SourceFile:9) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) [server.jar:git-Spigot-db6de12-18fbb24]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_101]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_101]
        at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [server.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [server.jar:git-Spigot-db6de12-18fbb24]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_101]
Caused by: java.lang.NullPointerException
        at com.realistic.events.GUI_Handler.GUI_guide(GUI_Handler.java:28) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_101]
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_101]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_101]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_101]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[server.jar:git-Spigot-db6de12-18fbb24]
        ... 15 more
>
 
А я читать еще до первого класса умел...
Какой я способный оказывается, видимо это не всем дано...
Код:
        at com.realistic.events.GUI_Handler.GUI_guide(GUI_Handler.java:28) ~[?:?]
 
умри.
У тебя ругается на код в классе Gui_Handler. Добавь проверку if (event.getCurrentItem() == null) { return};
Именно я добавлял, но все равно краш
Я просто импортировал через комбинацию, не заметил.
 
так ты скинь нужный класс.
Код:
package com.realistic.events;

import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;

import com.realistic.api.API;

public class GUI_Handler implements Listener {

    private API plugin;

    public GUI_Handler(API plugin) {
        this.plugin = plugin;
    }

    @EventHandler
    public void GUI_guide(InventoryClickEvent e) {

        Player p = (Player) e.getWhoClicked();

        if (e.getInventory().getName().equalsIgnoreCase(ChatColor.BLUE + "Помощь по выживанию")) {
            e.setCancelled(true);

            if (e.getCurrentItem().getItemMeta().getDisplayName() != null) {

                if (e.getCurrentItem().getType() == Material.BARRIER) {
                    p.closeInventory();
                }

                if (e.getCurrentItem().getItemMeta().getDisplayName()
                        .equalsIgnoreCase(ChatColor.GREEN + "Перейти на страницу крафтов.")
                        && e.getCurrentItem().getType() == Material.SIGN) {

                    p.closeInventory();
                    //GUI_mechanic.openGUI(p);
                }

                if (e.getCurrentItem().getItemMeta().getDisplayName()
                        .equalsIgnoreCase(ChatColor.GREEN + "Перейти на страницу крафтов медикаментов.")
                        && e.getCurrentItem().getType() == Material.SIGN) {

                    p.closeInventory();
                    //GUI_medicine.openGUI(p);
                }
               
                if(e.getCurrentItem() == null) {
                    p.closeInventory();
                }
            }
        }
    }
}
 
Код:
package com.realistic.events;

import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;

import com.realistic.api.API;

public class GUI_Handler implements Listener {

    private API plugin;

    public GUI_Handler(API plugin) {
        this.plugin = plugin;
    }

    @EventHandler
    public void GUI_guide(InventoryClickEvent e) {

        Player p = (Player) e.getWhoClicked();

        if (e.getInventory().getName().equalsIgnoreCase(ChatColor.BLUE + "Помощь по выживанию")) {
            e.setCancelled(true);

            if (e.getCurrentItem().getItemMeta().getDisplayName() != null) {

                if (e.getCurrentItem().getType() == Material.BARRIER) {
                    p.closeInventory();
                }

                if (e.getCurrentItem().getItemMeta().getDisplayName()
                        .equalsIgnoreCase(ChatColor.GREEN + "Перейти на страницу крафтов.")
                        && e.getCurrentItem().getType() == Material.SIGN) {

                    p.closeInventory();
                    //GUI_mechanic.openGUI(p);
                }

                if (e.getCurrentItem().getItemMeta().getDisplayName()
                        .equalsIgnoreCase(ChatColor.GREEN + "Перейти на страницу крафтов медикаментов.")
                        && e.getCurrentItem().getType() == Material.SIGN) {

                    p.closeInventory();
                    //GUI_medicine.openGUI(p);
                }
              
                if(e.getCurrentItem() == null) {
                    p.closeInventory();
                }
            }
        }
    }
}
ну нет... Это нормально делать проверки в самом конце?
 
Блyaaaat...
Ты сначало работаешь с айтемом который может быть null, а потом проверяешь его на null...
Это не программирование, это тупо логика... Которой у кое-кого НЕТ...
 
Java:
    @EventHandler
    public void GUI_guide(InventoryClickEvent e) {
        Player p = (Player) e.getWhoClicked();
        if (!e.getInventory().getName().equalsIgnoreCase(ChatColor.BLUE + "Помощь по выживанию")) {
            return;
        }
        e.setCancelled(true);
        if(e.getCurrentItem() == null) {
            return;
        }
        if (!e.getCurrentItem().hasItemMeta()) {
            return;
        }
        if (e.getCurrentItem().getItemMeta().getDisplayName().isEmpty()) {
            return;
        }
        if (e.getCurrentItem().getType() == Material.BARRIER) {
            p.closeInventory();
            return;
        }
        if (e.getCurrentItem().getItemMeta().getDisplayName()
                .equalsIgnoreCase(ChatColor.GREEN + "Перейти на страницу крафтов.")
                && e.getCurrentItem().getType() == Material.SIGN) {

            p.closeInventory();
            //GUI_mechanic.openGUI(p);
            return;
        }
        if (e.getCurrentItem().getItemMeta().getDisplayName()
                .equalsIgnoreCase(ChatColor.GREEN + "Перейти на страницу крафтов медикаментов.")
                && e.getCurrentItem().getType() == Material.SIGN) {

            p.closeInventory();
            //GUI_medicine.openGUI(p);
            return;
        }

    }
 
Спасибо, учел свои ошибки. Тема закрыта.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх