Welcome to Bukkit France

Inscrivez-vous maintenant pour profiter d'un accès total à tout le contenu offert par la meilleur communauté Bukkit française ! Une fois inscrit et connecté, vous pourrez contribuez à la communauté en postant vos propres sujets et questions ou en répondant à ceux existants. Vous pourrez aussi customiser votre profil, recevoir des points de réputations, communiquer avec les autres membres via le chat, et plus encore! 

  • Annonces

    • Pskyco

      Bukkit France passe sous Discord !   02/20/16

      Bukkit France est désormais passé sur Discord, au revoir donc notre vieux Teamspeak ! Téléchargez le client et venez nous rejoindre sur notre salon en suivant les instructions suivantes.
      M-à-j du 25/02/2017 : Désormais, seuls les comptes actifs sur le forum se verront donner l'accès au Discord, ce dernier n'est pas une plateforme d'aide de la même manière que le chat.
LouShunt

InventoryClickEvent nullpointerexception

17 messages dans ce sujet

InventoryClickEvent nullpointerexception

Explication du problème rencontré:

 

Bonjour, j'essaie de faire un petit menu. Le problème ces que lorsque je fais l’évent InventoryClickEvent j'ai un erreur de nullpointerexception lorsque je clique en dehors de l'inventaire. J'aimerait savoir quoi vérifié pour ne plus avoir ce problème et si possible un exemple de code. 

Mon code:

@EventHandler
    public void OnInventoryClick(InventoryClickEvent e) {
        if(e.getInventory() == null) return;
        if (!e.getInventory().getName().equalsIgnoreCase("§bKit")) return;
        if (e.getCurrentItem().getItemMeta() == null) return;
        Player p = (Player) e.getWhoClicked();
        if(e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase("§6§lSoldat")) {        //SOLDAT
            p.getInventory().clear();
            e.setCancelled(true);
            p.closeInventory();
            SetItem(Material.STONE_SWORD, 1, 0, "Couteau", 0, p);
            SetItem(Material.COOKED_BEEF, 16, 0, "Steak", 1, p);
            ItemStack helmet = new ItemStack(Material.LEATHER_HELMET, 1);
            p.getInventory().setHelmet(helmet);
            ItemStack chestplate = new ItemStack(Material.CHAINMAIL_CHESTPLATE, 1);
            p.getInventory().setChestplate(chestplate);
            ItemStack leggings = new ItemStack(Material.LEATHER_LEGGINGS, 1);
            p.getInventory().setLeggings(leggings);
            ItemStack boot = new ItemStack(Material.LEATHER_BOOTS, 1);
            p.getInventory().setBoots(boot);
            randomtp(p);
        }

Version serveur: 1.8.8

API utilisé: Spigot 

IDE: Eclipse

Spoiler

 

Recherche effectué : Google et discord

Information supplémentaire: Je tiens a dire que j'ai aucune erreur quand je fais un clique normal sur un item

Code d'erreur:

org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310) ~[spigot.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:1630) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PacketPlayInWindowClick.a(SourceFile:31) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PacketPlayInWindowClick.a(SourceFile:9) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_121]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_121]
        at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_121]
Caused by: java.lang.NullPointerException
        at ca.loushunt.heroblock.Evenement.OnInventoryClick(Evenement.java:124) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_121]
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_121]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_121]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_121]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot.jar:git-Spigot-db6de12-18fbb24]
        ... 15 more

 

Partager ce message


Lien à poster
Partager sur d’autres sites

if (e.getClickedInventory() ! = null)

3 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Si le slot est égale à -999, cela veut dire que tu clique en dehors de l'inventaire et si il est égale à -1 cela veut dire que tu clique sur les parois de l'inventaire, donc bloque l'event lorsque tu obtient ces 2 valeurs.

 

P.S: int slot = event.getSlot();

Modifié par Zurbeyira

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 5 heures, Zurbeyira a dit :

Si le slot est égale à -999, cela veut dire que tu clique en dehors de l'inventaire et si il est égale à -1 cela veut dire que tu clique sur les parois de l'inventaire, donc bloque l'event lorsque tu obtient ces 2 valeurs.

 

P.S: int slot = event.getSlot();

Ca doit aussi fonctionner mais je trouve ma solution plus propre et plus parlante (de plus elle marchera dans le temps alors que pour les slots ca peut changer dans le future).

2 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites

La plus part du temps quand tu fais des checks d'inventaire ou d'item ou autre, faut toujours faire une detection si il n'est pas null, ce qui te permettra de ne pas avoir d'erreur, même si le fait de faire ca ne change pas grand chose a part de ne pas être spam dans la console et c'est mieux de vérifier toujours :P 

2 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Au passage, pense à vérifier si l'item (getCurrentItem()) n'est pas null avant de vérifier s'il a une ItemMeta.

Aussi il existe une méthode pour vérifier ça : hasItemMeta(). ;)

Et pour être 100% sûr, vérifie aussi que l'ItemMeta possède un display name avec hasDisplayName().

3 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites

if(e.getInventory() != null)

if(e.getWhoClicked() != nul && e.getWhoClicked() instanceof Player)

if(e.getCurrentItem() != null)

 

//Si tu utilises les Meta 

 

if(e.getCurrentItem().hasItemMeta())

if(e.getCurrentItem().getItemMeta().hasDisplayName())

 

//Faire ton code

 

desole pour la mise en forme Mais j'écris depuis mon telephone 

3 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 23 heures, PimaPvP a dit :

Ca doit aussi fonctionner mais je trouve ma solution plus propre et plus parlante (de plus elle marchera dans le temps alors que pour les slots ca peut changer dans le future).

 

C'est beaucoup plus rapide de comparer des int, au lieu de faire des instanceof et si ça change dans le temps, tu update tes valeurs comme quand tu update tes dépendances.

Et au pire, tu fais un logger à chaque fois que tu clique pour récupérer le slot.

Modifié par Zurbeyira

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 57 minutes, Zurbeyira a dit :

 

C'est beaucoup plus rapide de comparer des int, au lieu de faire des instanceof et si ça change dans le temps, tu update tes valeurs comme quand tu update tes dépendances.

Et au pire, tu fais un logger à chaque fois que tu clique pour récupérer le slot.

J'ai jamais parlé de instanceof mais d'un != null donc en therme d'efficacité c'est la même chose que toi. Et oui juste si ca change toi tu devras update (donc le plugin ne fonctionnera plus correctement pour tous les utilisateurs qui ont ta version non update du plugin) contrairement à mon != null. J'ai l'impression que tu cherche toujours à avoir raison partout alors que là c'est pas une bonne façon de faire ta solution. 

2 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Non mais je t'explique comment supprimer le npe avec un check de slot, et toi, tu nous sort la méthode de l'an 1973 avec ton vieux check, tout pété. Ce forum est de pire en pire, on choisis toujours la solution, la plus simple et non la plus rapide, mauvais choix.

 

Non mais au pire, fais un test directement sur ton code et tu verra que ma solution est meilleur.

 

Puis pas besoin d'être désagréable, si t'as passé une journée de merde au collège, c'est pas mon problème.

Modifié par Zurbeyira

Partager ce message


Lien à poster
Partager sur d’autres sites

https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/inventory/InventoryClickEvent.html

getClickedInventory() : Gets the inventory that was clicked, or null if outside of window.

 

La méthode a été fait pour retourner l'inventaire cliqué, si c'est de hors de la fenêtre sa renvoie null, où est donc le problème dans cette méthode du coup :mellow:, au contraire t'auras moins de chance de devoir faire des modifications de ton plugin sur une nouvelle mise à jour ?

 

Et sinon où est la source, comme quoi ce que tu fais serait "plus rapide" ?

 
Modifié par keke142
1 personne aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites

@Zurbeyira Merci de ne pas être désagréable et de rester courtois.

 

Lors du développement, il faut aussi prendre en considération la facilité de maintenir son code. En l'occurrence, comparer à null est un meilleur moyen de maintenir car on aura pas à revenir dessus. De plus, la différence de rapidité entre une comparaison d'int et une comparaison à null est vraiment négligeable.

3 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 10 heures, Zurbeyira a dit :

Non mais je t'explique comment supprimer le npe avec un check de slot, et toi, tu nous sort la méthode de l'an 1973 avec ton vieux check, tout pété. Ce forum est de pire en pire, on choisis toujours la solution, la plus simple et non la plus rapide, mauvais choix.

 

Non mais au pire, fais un test directement sur ton code et tu verra que ma solution est meilleur.

 

Puis pas besoin d'être désagréable, si t'as passé une journée de merde au collège, c'est pas mon problème.

C'est au moins la 4ème fois qu'on est obligé de te dire de te calmer (cherche l'erreur). Et non je ne suis pas au collège mais en  2ème année de dut informatique en alternance. Je fais des semaines de 35 heures de code en entreprise et je suis des cours de profs agréé à enseigner le java  (entre autre) donc je pense être bien placé pour te dire que ta solution est mauvaise. 

Modifié par PimaPvP

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 7 heures, SystemGlitch a dit :

@Zurbeyira Merci de ne pas être désagréable et de rester courtois.

 

Lors du développement, il faut aussi prendre en considération la facilité de maintenir son code. En l'occurrence, comparer à null est un meilleur moyen de maintenir car on aura pas à revenir dessus. De plus, la différence de rapidité entre une comparaison d'int et une comparaison à null est vraiment négligeable.

 

Donc j'ai raison, merci.

 

il y a 22 minutes, PimaPvP a dit :

C'est au moins la 4ème fois qu'on est obligé de te dire de te calmer (cherche l'erreur). Et non je ne suis pas au collège mais en  2ème année de dut informatique en alternance. Je fais des semaines de 35 heures de code en entreprise et je suis des cours de profs agréé à enseigner le java  (entre autre) donc je pense être bien placé pour te dire que ta solution est mauvaise. 

 

On parle de développement, je vois pas ce que mon comportement fait ici et je vois pas de grade Modérateur sur ton profil.. Tu sais, j'ai appris le Java chez moi, et je surprends souvent les gas comme toi qui suivent des cours à la lettre. Au pire, si tu veux qu'on fasse un petit truc pour que je te mette en P.L.S, aucun problème. Mais arrête avec tes phrases stupide, les vrai développeurs expérimentés sont ceux qui apprennent chez eux, par plaisir (enfin, j'ai jamais vu de grand développeurs issus d'école). Et non ma solution est meilleur, la comparaison de int est plus rapide, tu devrais le savoir, monsieur l'étudiant xDD.

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a une heure, Zurbeyira a dit :

 

Donc j'ai raison, merci.

 

 

On parle de développement, je vois pas ce que mon comportement fait ici et je vois pas de grade Modérateur sur ton profil.. Tu sais, j'ai appris le Java chez moi, et je surprends souvent les gas comme toi qui suivent des cours à la lettre. Au pire, si tu veux qu'on fasse un petit truc pour que je te mette en P.L.S, aucun problème. Mais arrête avec tes phrases stupide, les vrai développeurs expérimentés sont ceux qui apprennent chez eux, par plaisir (enfin, j'ai jamais vu de grand développeurs issus d'école). Et non ma solution est meilleur, la comparaison de int est plus rapide, tu devrais le savoir, monsieur l'étudiant xDD.

Tu parle d'efficacité sur une condition de non nullité mais on parle de nano seconde ce qui est clairement négligeable alors que ma solution elle persistera pour toujours contrairement à toi (peut être).

De plus, moi je ne crois que ce que je vois:

	public static void main(String[] args){
		
		ArrayList<Integer> list = new ArrayList<Integer>();
		int integer = 10;
		
		long timeForInt = System.nanoTime();
		if(integer == 10){
		}
		System.out.println("Temps écoulé pour == 10 : "+(System.nanoTime() - timeForInt)+" nano secondes");
		
		long timeForList = System.nanoTime();
		if(list != null){
		}
		System.out.println("Temps écoulé pour != null : "+(System.nanoTime() - timeForList)+" nano secondes");

	}

output:

Temps écoulé pour == 10 : 23460 nano secondes
Temps écoulé pour != null : 2566 nano secondes

Donc je te prie de ne pas parler "d'efficacité" pour un truc aussi risible que ça (surtout que là le résultat est à mon avantage).

 

"j'ai jamais vu de grand développeurs issus d'école" -> Tout simplement que tu n'en connais pas, on voit vite la différence entre quelqu'un qui apprend soit même et celui qui a une formation. C'est d’ailleurs le principe d'une formation. Après je ne dis pas que je suis meilleur que toi ou quoi que ce soit, on est pas en duel de développeur, je m'en fiche complétement. Là tu dis juste à un novice une mauvaise méthode de procéder donc je lui donne la bonne manière de faire.

3 personnes aiment ça

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon ça suffit, je lock.

1 personne aime ça

Partager ce message


Lien à poster
Partager sur d’autres sites
Invité
Ce sujet ne peut plus recevoir de nouvelles réponses.

  • En ligne récemment   0 membre est en ligne

    Aucun utilisateur enregistré regarde cette page.