Résolu Une ligne de code fausse {InventoryClickEvent}

Luca_008

Architecte en herbe
21 Novembre 2016
150
20
125
22
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
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 531
24
2 247
347
28
Bruxelles - Belgique
www.phoenix-rebirth.fr
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
 

Luca_008

Architecte en herbe
21 Novembre 2016
150
20
125
22
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);
        }
    }
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 531
24
2 247
347
28
Bruxelles - Belgique
www.phoenix-rebirth.fr
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
 

Luca_008

Architecte en herbe
21 Novembre 2016
150
20
125
22
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..
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 531
24
2 247
347
28
Bruxelles - Belgique
www.phoenix-rebirth.fr
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
 

Luca_008

Architecte en herbe
21 Novembre 2016
150
20
125
22
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