PDA

View Full Version : [JAVA]nullpointerexception


Frank1962
20-02-2007, 14:46
Integer p = null;
prova(p);
System.out.println(p.intValue());

public void prova(Integer i) {
i = new Integer(5);
}

ma il passaggio di oggetti non avviene per riferimento? ...perchè allora quando eseguo mi da nullpointerexception?

PGI-Bis
20-02-2007, 14:58
No, il passaggio avviene per copia (aka per valore).

andbin
20-02-2007, 15:07
public void prova(Integer i) {
i = new Integer(5);
}Hai creato un nuovo oggetto Integer e ne hai assegnato il riferimento alla variabile locale 'i', che conteneva una copia del valore di 'p'.

Frank1962
20-02-2007, 15:14
e come faccio allora a simulare un passaggio per riferimento?

andbin
20-02-2007, 15:23
e come faccio allora a simulare un passaggio per riferimento?Non puoi passare un riferimento ad una variabile (di qualunque tipo). L'unica cosa che puoi fare è alterare lo stato di un oggetto, se ci sono dei metodi che lo consentono.

Frank1962
20-02-2007, 15:33
quindi java ha solo il passaggio per valore? ....da qualche parte avevo letto che la classe Integer permetteva di ottenre il passaggio per riferimento in modo da ovviare al passaggio per valore dei tipi primitivi (in questo caso l'int).....

PGI-Bis
20-02-2007, 15:39
E' stato un abbaglio (del lettore o dello scrittore :D).

Frank1962
20-02-2007, 15:39
E' stato un abbaglio (del lettore o dello scrittore :D).
del lettore moolto probabilmente :cry:

lovaz
20-02-2007, 15:56
No, il passaggio avviene per copia (aka per valore).
Questo è tutto da dimostrare :D

PGI-Bis
20-02-2007, 15:59
Per l'amor del cielo, non cominciamo un'altra discussione sui fantalinguaggi di programmazione :D

andbin
20-02-2007, 16:02
Questo è tutto da dimostrare :DNon ho capito bene il senso di questa affermazione ...... Java ha solo il passaggio per valore e basta.

Nel metodo A hai una variabile di tipo 'int'. Puoi passare al metodo B un riferimento alla variabile in modo tale che il metodo B possa alterarne il valore?? No .. ecco la dimostrazione.

lovaz
20-02-2007, 16:09
Infatti i primitivi sono passati per valore

Hawke
22-02-2007, 12:01
Allora ragazzi,
una cosa sono i tipi primitivi ed una cosa gli oggetti.

In ogni caso con gli oggetti si agisce tramite i riferimenti. Quindi l'istruzione

Integer p = null

dichiara un riferimento di tipo Integer che per ora non "punta" a nessun oggetto effettivo. Con la chiamata

prova(p);

si passa il riferimento per valore al metodo e non l'oggetto. Quindi inizializzando il riferimento all'interno del metodo "prova" l'oggetto non viene visto dal metodo chiamante.
Nel caso invece di un'istruzione di questo tipo

Integer p = new Integer(2);
prova(p);

si dichiara un riferimento di tipo Integer e lo si fa "puntare" (se mi sentisse il mio prof. mi ammazzerebbe) ad un oggetto effettivo. Quando si passa il riferimento (sempre per valore) al metodo "prova" si può agire sull'oggetto che è condiviso.

Spero di essermi spiegato.

lovaz
22-02-2007, 16:30
Beh, questo è risaputo.

The3DProgrammer
22-02-2007, 19:23
per fare quello ke dici tu dovresti passare un vettore di un elemento di Integer, ed allocare quindi l'elemento 0 nel metodo. Giusto per dire la mia sul passaggio di parametri, condivido in pieno quanto detto da hawke (pur non condividendone alcune espressioni C++ like :D). Quello ke succede nel codice scritto da frank è un po quello ke succede in C++ quando erroneamente si scrive:



int* p = NULL;

prova(p);

printf("%d",*p);


delete p;
...

void prova(int* p){

p=new int;

*p=5;

}



ovviamente il puntatore è passato per valore, quindi è impossibile modificare l'indirizzo puntato in prova(). Tipico errore di chi nn ha capito bene i puntatori =)

byez

EDIT:

ovviamente il vettore deve essere allocato all'esterno:

int [] p=new int[1];

byez

thebol
22-02-2007, 21:46
Questo è tutto da dimostrare :D

Infatti i primitivi sono passati per valore

rileggi bene quello che hai quotato :asd:

lovaz
23-02-2007, 08:45
Rileggi bene tu ;)