Domanda

Sono nuovo di Java. Ho appena letto che le variabili di classe in Java hanno un valore di default.

Ho provato il seguente programma e aspettavo per ottenere il risultato come 0, che è il valore predefinito su un numero intero, ma ho l'NullPointerException.

Che cosa mi manca?

class Test{
    static Integer iVar;

    public static void main(String...args) {
        System.out.println(iVar.intValue());
    }
}
È stato utile?

Soluzione

Hai ragione, variabili di classe non inizializzate in Java hanno un valore predefinito assegnato a loro. Tipo Integer in Java non è stesso int. Integer è la classe involucro che avvolge il valore di tipo int primitivo in un oggetto.

Nel tuo caso iVar è un riferimento a un oggetto Integer che non è stato initiliazed. riferimenti non inizializzati ottenere il valore di default di null e quando si tenta di applicare il metodo intValue () su un riferimento null si ottiene l'NullPointerException.

Per evitare questo problema del tutto il necessario per rendere la vostra variabile di riferimento si riferiscono a un oggetto Integer come:

class Test {
 // now iVar1 refers to an integer object which wraps int 0.
 static Integer iVar1 = new Integer(0);

 // uninitialized int variable iVar2 gets the default value of 0.
 static int iVar2;

 public static void main(String...args) {
  System.out.println(iVar1.intValue()); // prints 0.
  System.out.println(iVar2); // prints 0.
 }
}

Altri suggerimenti

Ciò significa che iVar è nullo. In Java, non si può invocare metodi su un riferimento null, genera il NullPointerException che si sta vedendo.

private Integer amount=Integer.valueOf(0);
private Integer points=Integer.valueOf(0);

In particolare, il motivo per cui si dovrebbe usare Integer.valueOf(int) al posto di new Integer (int):. CACHING

Questa variante del valueOf è stata aggiunta nel JDK 5 per Byte, Corto, Integer, e Long (già esistevano nel caso banale booleano dal JDK 1.4). Tutti questi sono, ovviamente, oggetti immutabili in Java. Usato per essere che, se avevi bisogno di un oggetto Integer da un int, che ci si costruisce un nuovo Integer. Ma in JDK 5+, si dovrebbe davvero utilizzare valueOf perché Integer ora memorizza nella cache oggetti interi fra -128 e 127 e può mano indietro la stessa identica Integer (0) oggetto ogni volta invece di sprecare una costruzione oggetto su un nuovo oggetto Integer identico

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top