Ce post a été conçut pour vous aider à comprendre les erreurs que vous rencontrez en java et les corriger par vous-même. Merci de regarder ici, si vous ne trouvez pas la réponse à votre problème avant de poster sur le forum. Ce post et pour tous les java (SE, EE et mobile).
=> Avant de commencer, un exemple de stack trace :
java.lang.NullPointerException
at Error.valueNull(Error.java:10)
at Error.display(Error.java:6)
at Error.main(Error.java:15)
On va apprendre à lire ces erreurs et à trouver le problème soi-même.
J'espère que ceci vous auras aidés et si vous rencontrez une erreur qui ne se trouve pas ici et que vous avez la solution au problème, merci de l'ajouter (je placerais un lien au sommaire). Si c'est un problème qui est seulement pour le Java EE, ou mobile, merci de le signaler sur votre post.
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(String.java:658)
at Exemple.main(Exemple.java:20)
[Une précision s'impose, toutefois : la méthode nextLine() récupère le contenu de toute la ligne saisie et replace la « tête de lecture » au début d'une autre ligne. Par contre, si vous avez invoqué une méthode comme nextInt(), nextDouble() et que vous invoquez directement après la méthode nextLine(), celle-ci ne vous invitera pas à saisir une chaîne de caractères : elle videra la ligne commencée par les autres instructions. En effet, celles-ci ne repositionnent pas la tête de lecture, l'instruction nextLine() le fait à leur place.]
Il existe d'autre solution pour résoudre le problème :
Scanner sc = new Scanner(System.in);
Double value1 = sc.nextDouble();
sc = new Scanner(System.in);
char value2 = sc.nextLine().charAt(0);
=>> Sans le Scanner : <<=
Voici un exemple :
String value = "";
char value1 = value.charAt(0);
On a l'erreur suivante :
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(String.java:658)
at Exemple.main(Exemple.java:19)
1) Trouver l'emplacement de l'erreur (stack trace) :
=> 1-1) Variable nulle :
Avant de commencer, String est une classe particulière, mais c'est une classe, donc ce qui va être dit est valable pour toutes les autres classes.
String peut être conçut (seulement la classe String) :
String theString = "";
Mais String peut être aussi conçut comme une classe normale :
String theString = new String("");
On va créer un programme bidon, c'est juste pour trouver l'erreur :
public class Error {
private static String theString;
public void display(String value) {
this.valueNull(value);
}
public void valueNull(String value1) {
System.out.println(value1.length());
}
public static void main(String[] args) {
Error error = new Error();
error.display(theString);
}
}
Ici on a l'erreur suivante :
java.lang.NullPointerException
at Error.valueNull(Error.java:10)
at Error.display(Error.java:6)
at Error.main(Error.java:15)
Vous allez voir chaque ligne à son importance .
Première ligne d'erreur : java.lang.NullPointerException
=> On pointe sur une variable nulle. Ok, mais pourquoi ? Seulement avec cette ligne, on ne va pas pouvoir répondre.
Voyons la deuxième ligne d'erreur : at Error.valueNull(Error.java:10)
=> L'erreur ce produit à la ligne 10 de la classe Error dans la méthode valueNull. Regardons la méthode :
public void valueNull(String value1) {
System.out.println(value1.length());
}
Ok, le problème vient de : value1.length();
On commence à voir le problème, l'objet String n'a pas été conçut et on ne peut pas utiliser ces méthodes. Le souci, c'est qu'il est conçut au niveau du paramètre de la méthode. Donc le problème ne vient pas d'ici.
Regardons la troisième ligne d'erreur : at Error.display(Error.java:6)
=> L'erreur ce produit à la ligne 6 de la classe Error dans la méthode display. Regardons la méthode :
public void display(String value) {
this.valueNull(value);
}
On reste sur le même problème que la méthode valueNull, toujours pas de solution à apporter.
Regardons la dernière ligne d'erreur : at Error.main(Error.java:15)
=> L'erreur ce produit à la ligne 15 de la classe Error dans la méthode main. Regardons la méthode :
public static void main(String[] args) {
Error error = new Error();
error.display(theString);
}
J'ai mis la variable theString dans la méthode display, mais je ne l'ai pas construite. Vu que la variable theString, c'est :
private static String theString;
Si, je la remplace par (correction) :
private static String theString = "";
Et là, je n'ai plus d'erreurs et j'ai réparé le problème tous seul . Mais, j'ai eu besoin de toutes les lignes d'erreurs pour résoudre le problème, ce n'est pas toujours le cas.
La ligne d'erreur du style (c'est un exemple) : at java.lang.String.charAt(Unknown Source)
La méthode de la classe String n'est pas visible en lecture (manque le code source), donc on ne peut pas avoir la ligne, ni lire son contenu.
Petit conseil : Corriger les lignes d'erreurs correspondent aux classes et méthodes que vous avez construites et si vraiment l'erreur persiste et que vous ne trouvez pas de solution, vous pouvez toujours poster le problème sur le forum.
=> 1-2) Manque un caractère ou caractère en trop pour le nom de la variable :
public class Error {
private static String values;
public void display(String value) {
this.valueNull(values);
}
public void valueNull(String value1) {
System.out.println(value1.length());
}
public static void main(String[] args) {
Error error = new Error();
error.display("");
}
}
On a l'erreur :
java.lang.NullPointerException
at Error.valueNull(Error.java:10)
at Error.display(Error.java:6)
at Error.main(Error.java:15)
Là si on regarde mal, on passe à côté de l'erreur . Ici tous à l'air bon, aucun souci, mais en fait, il y a une erreur à la ligne 6, dans la classe Error et dans la méthode display.
On n'entre pas la bonne variable dans la méthode valueNull. On rentre la variable values au lieu de rentrer la variable value et la variable values a une valeur nulle. Vérifié bien, que vous utilisez la bonne variable. A un caractère près, ce n'est plus la même variable. Ici on doit seulement supprimer le s à la fin de la variable values :
public void display(String value) {
this.valueNull(value);
}