web-dev-qa-db-fra.com

java.lang.ExceptionInInitializerError Causée par: Java.lang.NullPointerException

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.

7
Prashant Shilimkar

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:

  • Appel de la méthode d'instance d'un objet null.
  • Accéder ou modifier le champ d'un objet null.
  • Prendre la longueur de null comme s'il s'agissait d'un tableau.
  • Accéder ou modifier les slots de null comme s'il s'agissait d'un tableau.
  • Lancer null comme s'il s'agissait d'une valeur Throwable.

Vous frappez par le point le plus gras, puisque le tableau est null.

11
Suresh Atta

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 un index < 0 ou un
index > 19, ArrayIndexOutOfBoundException sera levé.

3
Infinite Recursion

LeNullPointerExceptionest 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[] ;

Changement 

static {
    x[0] = 1;
}

À

static {
    x= new int[5];
    x[0] = 1;
}

N'oubliez pas: Initialize the array before you use it.

2
MouseLearnJava

C'est simple. Ici, x est null et vous essayez de stocker une valeur dans array non initialisée. Par conséquent, NullPointerException

1
user3099347
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
}
1
Melquiades

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

1
svz

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.

0
Sathesh

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.
0
Raman Gupta