[JAVA] Jusqu'à ce que vous puissiez lire le journal des erreurs

Contexte

L'autre jour, sur Twitter, "[Vous n'êtes désespérément pas apte à la programmation, alors abandonnez et faites le travail de mettre des pissenlits sur sashimi](https://megalodon.jp/2019-0105-0145-49/note.mu/ Un article intitulé "kotofurumiya / n / n31d401fce782)" est apparu, mais je le recommande car il était très intéressant. Il y avait un contenu dans ce qu'il y avait trop d'étudiants qui ne pouvaient pas lire le journal des erreurs, et il y avait de nombreuses sections auxquelles je pouvais penser, donc pour le moment, je me concentrerai sur le plug-in Spigot et expliquerai comment lire le journal des erreurs. J'écris soudainement.

Regardons le journal des erreurs

Eh bien, tout d'abord, je ne parlerai pas sans journal des erreurs. Par souci d'explication, j'ai intentionnellement créé un plugin qui déclenche NullPointerException.

QiitaPlugin.java


package com.github.siloneco.qiita;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class QiitaPlugin extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(this, this);
        Bukkit.getLogger().info(getName() + " enabled.");
    }

    @Override
    public void onDisable() {
        Bukkit.getLogger().info(getName() + " disabled.");
    }

    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        Player p = null;
        p.sendMessage("test");
    }
}

Avec ce code, quand quelqu'un rejoint le serveur, il envoie un sendMessage nul et une erreur se produit. Et le journal des erreurs lorsque cela a réellement participé

latest.log


[14:23:24 ERROR]: Could not pass event PlayerJoinEvent to QiitaPlugin v1.0.0
org.bukkit.event.EventException: null
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
        at net.minecraft.server.v1_12_R1.PlayerList.onPlayerJoin(PlayerList.java:346) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
        at net.minecraft.server.v1_12_R1.PlayerList.a(PlayerList.java:166) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
        at net.minecraft.server.v1_12_R1.LoginListener.b(LoginListener.java:159) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
        at net.minecraft.server.v1_12_R1.LoginListener.e(LoginListener.java:57) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
        at net.minecraft.server.v1_12_R1.NetworkManager.a(NetworkManager.java:233) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
        at net.minecraft.server.v1_12_R1.ServerConnection.c(ServerConnection.java:140) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
        at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:845) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
        at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
        at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_231]
Caused by: java.lang.NullPointerException
        at com.github.siloneco.qiita.QiitaPlugin.onJoin(QiitaPlugin.java:26) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_231]
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_231]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_231]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_231]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.12.2.jar:git-Spigot-79a30d7-acbc348]
        ... 14 more

Un journal des erreurs a été généré avec succès.

Comment lire le journal des erreurs

Lisons ce journal immédiatement. Ici, j'ai essayé de le colorier pour une meilleure compréhension. image.png ** La seule partie que vous devez vraiment voir est la partie de couleur sombre **. Même si le journal des erreurs est si long, il y a si peu d'endroits à lire. Beaucoup de gens ne le savent pas, donc je ne peux pas lire le journal des erreurs. La procédure est très simple, mais vous devez d'abord vous souvenir du nom du package du plugin que vous créez. Ici, il s'agit de `` com.github.siloneco.qiita ''.

1. Recherchez la ligne contenant le nom de votre package

Dans l'image ci-dessus, c'est la partie bleu clair. Contient le nom du package du plugin que vous créez actuellement. La ligne commençant par à décrit l'emplacement de l'erreur, il vous suffit donc de regarder le nom du package utilisé par votre plugin. Fondamentalement, il est souvent juste après Causé par.

2. Regardez les parenthèses à droite de cette ligne

Dans l'image ci-dessus, il s'agit de la partie verte (QiitaPlugin.java:26) ''. Cela montre l'emplacement de l'erreur sous la forme de (nom du fichier: nombre de lignes) ''. Dans le cas de cet exemple, cela signifie qu'une erreur s'est produite dans la ligne 26 '' du fichier QiitaPlugin.java``.

3. Voir la raison de l'erreur

Faites attention à la partie verte restante. La couleur verte en haut (Impossible de passer l'événement PlayerJoinEvent à QiitaPlugin v1.0.0 '') n'est pas pertinente ici, mais je l'ai rendue verte pour le moment car la raison de l'erreur est parfois écrite ici. Cette fois, il y a un rapport indiquant que QiitaPlugin version 1.0.0 PlayerJoinEvent n'a pas pu être traité normalement ''. ** Si vous ne pouvez pas lire l'anglais, veuillez utiliser Google Traduction. Il sera renvoyé en japonais compréhensible. ** ** Jetez un œil à la couleur verte suivante (Causé par: java.lang.NullPointerException ''). Cela est évident si vous le lisez déjà. Causé par ~ '' signifie causé par '' ~, donc dans ce cas, il peut être compris comme causé par java.lang.NullPointerException ''. En d'autres termes, l'erreur qui s'est produite est une exception java.lang.NullPointerException ''.

4. Organisons-nous

Si vous ne pouvez pas l'organiser dans votre tête, vous pouvez l'écrire sur papier ou dans un bloc-notes. Organisons les informations obtenues en 1-3.

QiitaPlugin.Il y a une erreur sur la ligne 26 de java.
L'erreur qui s'est produite est java.lang.NullPointerException.

5. Découvrez quelle est l'erreur

Pas nécessaire si vous le savez déjà. Veuillez voler à 6. L'erreur qui s'est produite cette fois est java.lang.NullPointerException. Fouillons cela dans Google et découvrons-le. Il y aura peut-être de nombreux cas. S'il n'apparaît pas, ajoutez "solution" etc. au mot de recherche et il apparaîtra essentiellement. Si cela ne fonctionne pas, ajoutez «réparer», etc. Lors de la lecture de divers articles, il semble que NullPointerException soit une erreur ** qui se produit lorsque vous exécutez ** null avec un point (.) Connecté à lui **.

6. Sur la base de ce qui précède, examinons la partie problématique

Jetons un œil au code en question

QiitaPlugin.java-24e ligne


p.sendMessage("test");

Eh bien, dans cette ligne, la seule chose qui relie les points est p ''. Il est donc très probable que p '' soit nul. Allons vérifier

QiitaPlugin.java-Ligne 23-27e ligne


@EventHandler
public void onJoin(PlayerJoinEvent e) {
    Player p = null;
    p.sendMessage("test");
}

Après tout, nul a été attribué à `` p ''. Il est résolu en changeant en ʻe.getPlayer () `.

Bonus: j'ai eu une autre erreur après avoir corrigé l'erreur

C'est une histoire commune. Revenons à 1 et résolvons la nouvelle erreur.

Je ne peux toujours pas résoudre!

S'il y a une erreur qui ne peut être résolue par tous les moyens, il est plus rapide de demander à une personne. Il existe de nombreuses façons de faire cela, comme écouter dans la communauté ou demander à quelqu'un qui est meilleur que vous. Ce à quoi je veux que tu fasses attention à ce moment-là

  1. Spécifiez l'environnement
  2. Présentez le code
  3. Présentez le journal des erreurs
  4. Décrivez d'autres informations détaillées qui pourraient être pertinentes

Faites attention à ces choses et posez des questions. ** Les erreurs complexes qui ne peuvent pas être résolues en regardant uniquement le journal des erreurs sont probablement liées à l'environnement. ** Par exemple, quelle est la version Java, quelle est la version du serveur, qu'est-ce que l'erreur se produit, quel type de changement a été effectué si cela fonctionnait normalement avant le changement, etc. Besoin de beaucoup d'informations. ~~ Veuillez arrêter s'il semble être cassé même si vous n'avez rien fait () ~~

finalement

C'était le premier article de Qiita, mais j'espère que cela aidera autant de développeurs de plugins que possible. Les thèmes et les questions sur les plugins sont acceptés dans la Boîte à thèmes, donc si vous en avez envie, veuillez le mettre. Eh bien.

modifier l'historique

21/04 - Je n'avais pas besoin du titre

Recommended Posts

Jusqu'à ce que vous puissiez lire le journal des erreurs
Jusqu'à ce que vous puissiez utiliser l'API Google Speech
La lecture du compteur analogique peut être effectuée avec l'exemple MNIST.
La lecture du compteur analogique peut être effectuée avec l'exemple MNIST.
Pouvez-vous supprimer ce fichier?
Essayez et apprenez iptables, jusqu'à ce que vous puissiez naviguer sur le Web
Jusqu'à ce que vous puissiez utiliser opencv avec python
Jusqu'à ce que vous installiez Caffe et exécutiez l'exemple
Jusqu'à ce que vous utilisiez l'API Kaggle avec Colab
Jusqu'à ce que l'exemple de changefinder s'exécute sur python
Jusqu'à ce que vous puissiez installer Blender et l'exécuter avec python pour le moment
Jusqu'à ce que vous installiez Gauge et exécutiez l'exemple officiel
Comment lire le journal du solveur CBC (Pulp, python-mip)
Jusqu'à ce que vous puissiez faire une reconnaissance d'image simple avec Jupyter
Lire la documentation OpenCV
Jusqu'à ce que vous installiez MySQL-python
lire le tag qui vous est attribué dans ec2 avec boto3
Jusqu'à ce que vous puissiez installer votre propre bibliothèque Python avec pip
Vous qui coloriez le journal pour le rendre plus facile à voir
Ce que vous pouvez faire avec les statistiques de la bibliothèque Python standard
Analysez la réponse pour pouvoir gratter la propre histoire de Wantedly