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?
No, il passaggio avviene per copia (aka per valore).
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?
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).....
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:
No, il passaggio avviene per copia (aka per valore).
Questo è tutto da dimostrare :D
Per l'amor del cielo, non cominciamo un'altra discussione sui fantalinguaggi di programmazione :D
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.
Infatti i primitivi sono passati per valore
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.
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
Questo è tutto da dimostrare :D
Infatti i primitivi sono passati per valore
rileggi bene quello che hai quotato :asd:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.