Ceci est tiré de l'exemple de l'OCJP. J'ai écrit le code suivant
public class Test {
static int x[];
static {
x[0] = 1;
}
public static void main(String... args) {
}
}
Sortie: Java.lang.ExceptionInInitializerError
Causée par: Java.lang.NullPointerException à x[0] = 1;
Pourquoi lance-t-il NullPointerException
et non ArrayIndexOutOfBoundException
.
Pourquoi lance-t-il NullPointerException et non ArrayIndexOutOfBoundException?.
Parce que vous n'avez pas initialisé le tableau.
Initialiser le tableau
static int x[] = new int[10];
Raison de NullPointerException :
Lancé lorsqu'une application tente d'utiliser null dans un cas où un objet est requis. Ceux-ci inclus:
Vous frappez par le point le plus gras, puisque le tableau est null
.
Il lance NullPointerException parce que x is null
.
x [] est déclaré, mais pas initialisé.
Avant initialisation, les objets ont une valeur nulle et les primitives ont des valeurs par défaut (par exemple, 0, faux, etc.)
Donc, vous devriez initialiser comme indiqué ci-dessous:
statique int x [] = new int [20];
//at the time of declaration of x
ou
statique int x [];
x = new int [20];//after declaring x[] and before using x[] in your code
ArrayIndexOutOfBoundException se produira si le tableau est initialisé et auquel on accède avec un index illégal.
par exemple :
x contient 20 éléments, donc les indices 0 à 19 sont valides, si on y accède avec unindex < 0
ou unindex > 19
, ArrayIndexOutOfBoundException sera levé.
LeNullPointerException
est rejeté dans lestatic block
, où vous essayez d'attribuer une valeur 1 au premier élément du tableau ( x [0] = 1 ). Sachez que le tableau int [] nommé nommé x n'est toujours pas intégré.
public class Test {
static int x[];
static {
x[0] = 1;// Here is the place where NullPointException is thrown.
}
public static void main(String... args) {
}
}
Il y a 2 façons pour vous de le réparer.
1 Utilisez static int x[] = new int[5];
au lieu de static int x[] ;
2
Changement
static {
x[0] = 1;
}
À
static {
x= new int[5];
x[0] = 1;
}
N'oubliez pas: Initialize the array before you use it.
C'est simple. Ici, x est null
et vous essayez de stocker une valeur dans array
non initialisée. Par conséquent, NullPointerException
static int x[];
static {
x[0] = 1;
}
Résultats dans NullPointerException, car votre tableau x n'est pas initialisé (est null)
Une exception ArrayIndexOutOfBoundException se produirait si vous accédiez à un index hors limites:
static int x[] = new int[10];
static {
x[20] = 1; //<-----accessing index 20
}
Vous n'avez pas initialisé votre tableau x
. Il y a une différence entre la déclaration et l'initialisation des variables. Lorsque vous écrivez int x[];
, vous déclarez simplement une variable qui, en tant que champ d'instance, est initialisée avec une valeur par défaut de null
. Pour créer réellement un tableau, vous devez écrire int x[] = new int[10];
ou la taille dont vous avez besoin.
La raison pour laquelle on a NullPointerException
au lieu de ArrayIndexOutOfBounds
est que ce dernier est lancé lorsque vous avez un tableau et que vous essayez de régler une position en dehors de ses limites, mais que dans votre cas, vous n'avez pas du tout de tableau dans un tableau non-exsting. C’est pourquoi une NPE
NullPointerException: Cette exception est levée lorsque vous essayez d'accéder aux propriétés d'un objet non initialisé.
ArrayIndexOutOfBoundsException: Cette exception est levée lorsque le tableau est initialisé avec un objet mais que vous essayez d'accéder au tableau avec un index non valide.
Dans votre cas, puisque vous n'avez pas initialisé votre objet, vous obtenez NullPointerException. Vous avez créé une personne nommée "x" mais n'avez associé aucun être humain (objet tableau).
Si vous changez la ligne 2 en,
static int x[] = new int[];
vous obtiendrez alors ArrayIndexOutOfBoundsException au lieu de NullPointerException.
ExceptionInInitializerError est une exception non contrôlée.
Lors de l'exécution du bloc statique, l'initialisation de la variable statique, si une exception survient, il s'agit de ExceptionInInitializerError.
exemple:
class Test{
static int x = 10/0;
}
sortie:
Runtime Exception: ExceptionInInitializerError caused by Java.lang.ArithmeticExcpetion.
exemple:
class Test{
static{
String s = null;
System.out.println(s.length());
}
}
sortie:
Runtime Exception: ExceptionInInitializerError caused by Java.lang.NullPointerException.