Résolu Une ligne de code fausse {InventoryClickEvent}

  • Auteur de la discussion Auteur de la discussion Luca_008
  • Date de début Date de début

Luca_008

Architecte en herbe
21 Novembre 2016
150
20
125
23
Bonsoir à tous;

J'ai une erreur sûrement très bête mais qui s'avère assez embêtante...

Puisque dans un de mes events (InventoryClickEvent), il s'avère qu'il y ait une erreur NullPointer mais le code fonctionne quand même, ça fait juste dég en console,,, De plus j'ai exactement la même ligne de code dans un autre plugin qui fonctionne très bien sans erreur

Lignes en question:
Code:
    public void OnArmor(InventoryClickEvent e){
        (Ligne 241)if(e.getCurrentItem().getItemMeta().getDisplayName().contains(ChatColor.WHITE + "Team")){
            e.setCancelled(true);
        }

plus précisément à la ligne de la condition.. La seule info qu'on me donne en console:

Code:
Caused by: java.lang.NullPointerException
    at me.luca008.hikabrain.HikaListeners.OnArmor(HListeners.java:241) ~[?:?]

Quelqu'un saurait à quoi c'est dû ?

En attendant je vous souhaite une agréable soirée/nuit

à bientôt
 
Salut,

Tu as donc quelque chose de "null" dans cette condition:
"if(e.getCurrentItem().getItemMeta().getDisplayName().contains(ChatColor.WHITE + "Team")){"
Je suppose donc que tu as découpé terme par terme pour voir d'où ça venait... Ha bah non si tu poses la question ici :P

Bref, une bonne pratique est de simplement décomposer cette instruction pour voir plus précisément où est l'erreur. Exemple:
Code:
ItemStack currentItem = e.getCurrentItem();
ItemMeta currentItemMeta = currenItem.getItemMeta();
String displayName = currentItemMeta.getDisplayName();
if(displayName.contains(ChatColor.WHITE + "Team")){
En mettant ce code tu aurais vu que l'erreur peut venir de la seconde ligne (le getItemMeta). J'ai également un doute sur le fait que l'itemMeta soit toujours définit (il me semble, mais dans le doute, je vais le rajouter ici... je n'ai pas le temps de faire des tests, mais toi tu peux voir exactement où est le soucis ;) ).
Il faut donc soit faire deux conditions, soit mettre un "&&" dans ta condition:
Code:
if(e.getCurrentItem() != null && e.getCurrentItem().getItemMeta() != null 
&& e.getCurrentItem().getItemMeta().getDisplayName().contains(ChatColor.WHITE + "Team")){


Cordialement,
Detobel36
 
Bonjour, merci pour ta réponse précise et claire, j'ai pu faire ce que tu m'as dis, alors effectivement il n'y a plus d'erreur lorsqu'un joueur clique sur un item contenant "Team" en blanc dans son DisplayName, mais lorsqu'il appuie sur quelque chose ne contenant pas ce DisplayName (Team), la console me renvoie une erreur denouveau sur la ligne 241, du coup j'me suis dis je mets :
Code:
        else {
            e.setCancelled(false);
        }
Mais si j'ai jamais du faire ça de ma vie, mais l'erreur s'affiche toujours...

Donc je ne viens pas là en n'ayant rien cherché de moi même.. Mais j'ai pas d'autre idées :/

Bonne matinée
[EDIT]
J'ai placé la condition sur deux lignes, le "&& e.getetc.." je l'ai mis en dessous et c'est bien là qu'est l'erreur

Code:
    @EventHandler
   
    public void OnArmor(InventoryClickEvent e){
        if(e.getCurrentItem() != null && e.getCurrentItem().getItemMeta() != null 
           ici     && e.getCurrentItem().getItemMeta().getDisplayName().contains(ChatColor.WHITE + "Team")){
            e.setCancelled(true);
        }
        else {
            e.setCancelled(false);
        }
    }
 
Salut,

T'aider en ayant 2 lignes de codes n'est pas simple... Surtout quand tu dis "ligne 241". Je suppose que tu as modifié ton code donc c'est peut-être pas la même que dans ton premier poste.

Pour t'aider correctement il me faudrait donc plus d'informations (à la limite toute la méthode prenant en compte l'event "InventoryClickEvent").
Car un e.setCancelled ne réglera jamais un problème de null xD


Cordialement,
Detobel36
 
Code:
    @EventHandler
   
    public void OnArmor(InventoryClickEvent e){
        241if(e.getCurrentItem() != null && e.getCurrentItem().getItemMeta() != null 
                242&& e.getCurrentItem().getItemMeta().getDisplayName().contains(ChatColor.WHITE + "Team")){
            e.setCancelled(true);
        }
        else {
            e.setCancelled(false);
        }
    }

Mais je ne sais pas si tu as vu mon edit juste en dessus je t'avais affiché le code ^^

Car un e.setCancelled ne réglera jamais un problème de null xD
Je pensais bien mais j'ai quand même essayé, mais puisque tu dis que cela ne réglera jamais un problème de null, je le ferais plus..
 
Salut,

e.setCanceled dit juste à bukkit que l'event doit être annulé. Mais ton code va continuer à s'exécuter... Donc le null va arriver.

Je sais pas trop d'où ça peut venir... il me semblait que le displayName devait toujours être un string :/ Bref, essayes ça:
PHP:
@EventHandler
public void OnArmor(InventoryClickEvent e){
    if(e.getCurrentItem() != null && e.getCurrentItem().getItemMeta() != null
            && e.getCurrentItem().getItemMeta().getDisplayName() != null &&
            e.getCurrentItem().getItemMeta().getDisplayName().contains(ChatColor.WHITE + "Team")) {

        e.setCancelled(true);
    }
    /*else {
        e.setCancelled(false); // par défaut il est en false, inutile donc de le remettre :)
    }*/
}


Cordialement,
Detobel36
 
e.setCanceled dit juste à bukkit que l'event doit être annulé. Mais ton code va continuer à s'exécuter... Donc le null va arriver.
Merci pour cette info, je le saurai comme ça maintenant ^^
Bref, une bonne pratique est de simplement décomposer cette instruction pour voir plus précisément où est l'erreur. Exemple:
Maintenant je sais aussi qu'il faut essayer de décomposer un code pour trouver l'erreur, merci :p

Et merci pour ton aide tout court.

Bonne journée.
Topic résolu
 
  • J'aime
Reactions: Detobel36