[java] NullPointerException ?

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
marcelloma
Linux 0.x
Linux 0.x
Messaggi: 80
Iscritto il: dom 23 nov 2008, 17:01
Nome Cognome: Marcello
Slackware: 12.1
Kernel: 2.6.24.5-smp
Desktop: xfce

[java] NullPointerException ?

Messaggio da marcelloma »

Problemino in java

Codice: Seleziona tutto

public class Rubrica
{
    private Persona persona[];
    public void creaPagine()
    {
	persona = new Persona[5];
    }

    public void Cerca(String n,  int tipo)
    {
    
	for (int i=0; i<5; i++)
	    {
		if (persona[i].getCognome() == n)
		    {
			System.out.println(this.persona[i].getNome());
			System.out.println(this.persona[i].getCognome());
			System.out.println(this.persona[i].getIndirizzo());
		    }
		    
	    }
    }
    
    public void setNome(int x, String n)
    {
	System.out.println("Settando " + x + "a " + n);
	persona[x].setNome(n);
    }
    public void setCognome(int x, String n)
    {
	persona[x].setCognome(n);
    }
    public void setIndirizzo(int x, String n)
    {
	persona[x].setIndirizzo(n);
    }
}

Codice: Seleziona tutto

public class Principale
{
    public static void main(String[] args)
    {
	Rubrica rubrica = new Rubrica();
	
	rubrica.creaPagine();

	rubrica.setNome(0, "Luca");
	/*
	 
	rubrica.setCognome(0, "Rossi");
	rubrica.setNome(1, "aaa");
	rubrica.setCognome(1, "bb");
	rubrica.setNome(2, "aaa");
	rubrica.setCognome(2, "bb");
	rubrica.setNome(3, "aaa");
	rubrica.setCognome(3, "bb");
	rubrica.setNome(4, "aaa");
	rubrica.setCognome(4, "bb");
	System.out.println("Inserisci per 0 per nome , 1 per cognome, 2 per indirizzo");
	
	rubrica.Cerca("Luca", 0);
	*/
    }
}
~/sandbox/java $ java Principale

Exception in thread "main" java.lang.NullPointerException
at Rubrica.setNome(Rubrica.java:27)
at Principale.main(Principale.java:9)

Come vedete il metodo rubrica.creaPagine(); istanzia il vettore persona che poi viene modificato da rubrica.setNome(0, "Luca"); quindi non capisco perche' mi da' questo errore.Idee?
Ultima modifica di targzeta il lun 8 dic 2008, 17:27, modificato 1 volta in totale.
Motivazione: Cambiato nome da NullExceptionPointer in NullPointerException, dato che è così che si chiama l'eccezione :)

Avatar utente
alessiodf
Linux 3.x
Linux 3.x
Messaggi: 823
Iscritto il: ven 14 ott 2005, 21:04
Slackware: current
Kernel: 2.6.26.4
Desktop: Kde 4.1
Località: Roma
Contatta:

Re: [java] NullExceptionPointer ?

Messaggio da alessiodf »

semplicemente non hai instanziato il puntatore "Persona" nella posizione 'x'.

Quando tu fai: persona = new Persora[5] lui instanzia si' un array lungo 5 di tipo persona, ma ogni persona e' ancora NULL finche tu non lo inizializzi:

persona = new Persona();

inoltre.. perche' invece di fare un vettore, non usi una bella List?? o meglio ancora una Map (Mappa)

Ciao

ps: puoi correggere cosi':

Codice: Seleziona tutto


public void setNome(int x, String n)
{
    System.out.println("Settando " + x + "a " + n);
    if(persona[x] == NULL)
        persona[x] = new Persona();
    
    persona[x].setName(n);
}

Ultima modifica di alessiodf il lun 8 dic 2008, 17:23, modificato 1 volta in totale.

marcelloma
Linux 0.x
Linux 0.x
Messaggi: 80
Iscritto il: dom 23 nov 2008, 17:01
Nome Cognome: Marcello
Slackware: 12.1
Kernel: 2.6.24.5-smp
Desktop: xfce

Re: [java] NullExceptionPointer ?

Messaggio da marcelloma »

Grazie mille!
Grazie anche per l'altro suggerimento ;)

Avatar utente
raffaele181188
Packager
Packager
Messaggi: 789
Iscritto il: ven 7 set 2007, 21:40
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu
Località: DearSkin (FG)

Re: [java] NullPointerException ?

Messaggio da raffaele181188 »

Se è come penso io è abbastanza semplice e forse hai già risolto. E' un problema di inizializzazione. Il metodo creaPagine() **A proposito, meglio se inizia con la lettera minuscola...** crea l'array con 5 elementi (mi pare) ma i references a quegli elementi sono tutti null. Quindi la soluzione è:
Nel metodo creaPagine() fai così:

Codice: Seleziona tutto

public void creaPagine() {
   persone = new Persona[5];//meglio se lo chiami al plurale
   for (int i = 0; i < 5; i++){
      persone[i] = new Persona();
   }
}
Anche se non sono proprio sicuro che il creaPagine() che tu desideri debba fare proprio così, comunque è quello che hai scritto tu

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [java] NullPointerException ?

Messaggio da targzeta »

In effetti, la soluzione postata da alessiodf funziona a condizione che il primo metodo invocato sia proprio setNome(). Se è vero che è proprio così che viene usata la classe in questo esempio, è vero anche che si potrebbero incontrare altre eccezioni di questo tipo più in là senza capire perchè.

Io opterei per un controllo su ogni metodo della classe (magari tramite classe astratta, o superclasse, oppure un metodo privato invocato da ogni altro metodo prima di iniziare a manipolare l'oggetto), in questo modo non si ha la necessita di consumare memoria appena creato l'oggetto come invece suggerisce raffaele181188.

Un altro problema però mi turba nel codice:

Codice: Seleziona tutto

...
public void Cerca(String n,  int tipo)
...
for (int i=0; i<5; i++)
...
if (persona[i].getCognome() == n)
...
In Java si possono confrontare così due stringhe?
In oltre, dopo un match, non sarebbe meglio uscire dal ciclo? oppure si è pensato a persone omonime di cognome?

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
raffaele181188
Packager
Packager
Messaggi: 789
Iscritto il: ven 7 set 2007, 21:40
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu
Località: DearSkin (FG)

Re: [java] NullPointerException ?

Messaggio da raffaele181188 »

Sulla comparazione delle stringhe ti rispondo io
Per quello che ne so per comparare gli oggetti si usa il metodo equals(), ma nel caso particolare delle String, i creatori di java hanno optato per un piccolo artificio. Dal momento che le stringhe sono immutabili è perfettamente sicuro condividerle tra più references. Provo a spiegare meglio. Una volta creata la String "Hello World" e averla assegnata ad un reference, tutte le altre volte che si usa la stringa "Hello world" i references puntano alla stessa area di memoria. Ad esempio
String first = "Hello! I'm a String"; // first @ 0xABCDEF
String second = "Hello! I'm a String"; //La JVM non crea un nuovo oggetto String nell'heap, ma piuttosto assegna al reference "second" il valore 0xABCDEF

In questo modo comparando i references first e second con l'operatore == si ottiene true come se si usasse equals()
La differenza è che == confronta gli indirizzi in memoria, mentre equals() il contenuto vero e proprio delle stringhe

Dovrebbe essere una feature del linguaggio introdotta per facilitare l'operazione di confronto tra stringhe (molto comune) a programmatori provenienti da altri linguaggi, necessaria in quanto in Java non si possono overloadare gli operatori. Il risultato è che == per le stringhe restituisce lo stesso risultato di equals() (immagina un programmatore inesperto chissà dove andava a cercare l'errore...)

Se ho detto una ca*ta megagalattica fatemi sapere

PS Sono d'accordo con Spina sul metodo cerca(), ma devo dire che, più in generale, il tutto è studiato maluccio. Io userei un HashSet per la rubrica e sfrutterei i suoi metodi per effettuare le varie operazioni. Se poi la classe ti serve per studiare la grammatica del linguaggio allora può avere senso scrivere certi metodi a mano, anche se gli algoritmi rischiano di essere complicati andando avanti. E magari se ti fermi 2 secondi e butti su un foglio bianco le caratteristiche principali della classe, puoi ripensare a tutto e scegliere un HashMap (che è l'ideale in questi casi, ma è inutile per l'uso che ne devi fare nel codice postato)

@Spina La mia soluzione rischia di sprecare memoria, è vero, ma consente di raggruppare il codice. Metti che un domani lui voglia fare che

Codice: Seleziona tutto

if (persona[x] == null){
   persona[x] = blocco di codice per istanziare una persona di default o eseguire dei controlli o qualunque altra cosa
}
Allora dovrebbe cambiare il codice di tutti i metodi. In fondo su un computer con 1GB di ram, quanto può influire un array di 5 stringhe? E poi l'ottimizzazione è una fase successiva, e per un piccolo programma non è il caso di complicarsi la vita...

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [java] NullPointerException ?

Messaggio da targzeta »

raffaele181188 ha scritto:...
Una volta creata la String "Hello World" e averla assegnata ad un reference, tutte le altre volte che si usa la stringa "Hello world" i references puntano alla stessa area di memoria. Ad esempio
String first = "Hello! I'm a String"; // first @ 0xABCDEF
String second = "Hello! I'm a String"; //La JVM non crea un nuovo oggetto String nell'heap, ma piuttosto assegna al reference "second" il valore 0xABCDEF
...
Ho visto che il metodo equals() della classe String ritorna un booleano, e quindi, se quello che dici è vero (ma ricordo qualcosa di simile anche io) sulla gestione dello heap, allora equals() e '==' dovrebbero essere identici.
raffaele181188 ha scritto: ...
@Spina La mia soluzione rischia di sprecare memoria, è vero, ma consente di raggruppare il codice. Metti che un domani lui voglia fare che

Codice: Seleziona tutto

if (persona[x] == null){
   persona[x] = blocco di codice per istanziare una persona di default o eseguire dei controlli o qualunque altra cosa
}
Allora dovrebbe cambiare il codice di tutti i metodi. In fondo su un computer con 1GB di ram, quanto può influire un array di 5 stringhe? E poi l'ottimizzazione è una fase successiva, e per un piccolo programma non è il caso di complicarsi la vita...
Qui non sono d'accordo. Non è mia abitudine fare copia-incolla del codice, quindi l'esempio calza solo per i non-programmatori. Sul fatto che poi l'ottimizzazione vada fatta in una fase successiva mi sembra troppo grossa :). Il codice va pensato ottimale, piccolo o grande che sia il programma che si vuole scrivere. Uno perchè oggi sono 5 stringhe, domani potrebbero essere milioni, e se non pensi in questo modo, allora la tua classe non è riusabile, e quindi inutile per la programmazione ad oggetti :).
Inoltre, penso che l'hai sparata grossa, anche perchè secondo me non ci credi nemmeno tu, altrimenti che senso avrebbe suggerire l'HashSet? Per oggi va benissimo l'array non trovi? Per 5 stringhe :D

Infine, ma non per importanza, ti faccio i miei complimenti (per quanto possano valere) per la conoscenza del linguaggio Java che hai dimostrato,
Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
neongen
Packager
Packager
Messaggi: 827
Iscritto il: ven 25 mag 2007, 12:37
Nome Cognome: Enrico
Slackware: 14.0_64
Kernel: 3.4.4
Desktop: KDE 4.5.5
Distribuzione: Maemo 5
Contatta:

Re: [java] NullPointerException ?

Messaggio da neongen »

spina ha scritto: Ho visto che il metodo equals() della classe String ritorna un booleano, e quindi, se quello che dici è vero (ma ricordo qualcosa di simile anche io) sulla gestione dello heap, allora equals() e '==' dovrebbero essere identici.
no perchè, mentre stringa1.equals(stringa) verifica che stringa2 sia di tipo String e contenga la stessa sequanza di caratteri di stringa1 (anche se magari in locazioni di memoria differenti), ==:
While == may be used to compare references of type String, such an equality test determines whether or not the two operands refer to the same String object. The result is false if the operands are distinct String objects, even if they contain the same sequence of characters. The contents of two strings s and t can be tested for equality by the method invocation s.equals(t).
edit: @raffaele == confronta i riferimenti, equals() no <- si riferisce al post che evidentemente hai cancellato

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [java] NullPointerException ?

Messaggio da targzeta »

Ok neongen, quindi possiamo decretare che le stringhe in Java vanno confrontate con il metodo equals()! Quindi marcelloma ... a buon intenditore ;)

Thanks,
Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
raffaele181188
Packager
Packager
Messaggi: 789
Iscritto il: ven 7 set 2007, 21:40
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu
Località: DearSkin (FG)

Re: [java] NullPointerException ?

Messaggio da raffaele181188 »

@spina: equals() è un metodo di Object (quindi a disposizione di tutti gli oggetti in java) ed è programmato per confrontare references (in Object). Il comportamento anomalo qui è quello della JVM, che anzichè allocare spazio per una nuova String IDENTICA ad una già creata in precedenza, si accorge della cosa e assegna alla nuova lo stesso indirizzo in memoria della vecchia, e con nessun'altra classe si comporta in questo modo. Ma quello che ha trovato neongen sembra smentire la mia tesi... Verificherò...

Sull'ottimizzazione io ho un parere diverso, ritengo che vada calibrata sulle dimensioni del progetto. E comunque, meglio prima di tutto che il codice compili, non ti pare?

Infine, mi dispiace ma non sono d'accordo sull'introduzione del controllo in ogni metodo. Un oggetto null indica una sola cosa: un errore GRAVE di programmazione dell'inserimento dei nominativi (come in questo caso). Giusto, quindi, che la VM lanci una NullPointerException (che in effetti è una RuntimeException) così che il programmatore possa rendersi subito conto che è in presenza di un problema grave e vada a cercarlo, mentre, con la soluzione proposta, per lo sviluppatore è più arduo tracciare l'errore. Il metodo creaPagina() mi sembra un metodo-test, quindi è giusto inizializzare al suo interno l'array. Un programmatore client userebbe un metodo (non ancora implementato) aggiungiPersona(Persona p) della rubrica, non certo creaPagina(). Ma a questo punto faccio notare a marcelloma ( a proposito, ma che fine hai fatto?) che le classi nel loro insieme non sembrano ponderate più di tanto, non ti pare? Alcune cose sono un po' forzate... Anche se si tratta solo di un esercizio è sempre meglio progettare la classe (in testa o su un foglio) prima di iniziare a codificarla...

Avatar utente
neongen
Packager
Packager
Messaggi: 827
Iscritto il: ven 25 mag 2007, 12:37
Nome Cognome: Enrico
Slackware: 14.0_64
Kernel: 3.4.4
Desktop: KDE 4.5.5
Distribuzione: Maemo 5
Contatta:

Re: [java] NullPointerException ?

Messaggio da neongen »

raffaele181188 ha scritto:@spina: equals() è un metodo di Object (quindi a disposizione di tutti gli oggetti in java) ed è programmato per confrontare references (in Object).
esatto ma in String è overrided, non ereditato.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [java] NullPointerException ?

Messaggio da targzeta »

raffaele181188 ha scritto:...
Infine, mi dispiace ma non sono d'accordo sull'introduzione del controllo in ogni metodo.
...
mentre, con la soluzione proposta, per lo sviluppatore è più arduo tracciare l'errore.
...
Un programmatore client userebbe un metodo (non ancora implementato) aggiungiPersona(Persona p) della rubrica, non certo creaPagina()
...
Caro raffaele181188,
come sai queste discussioni possono non avere fine, sono gusti, l'importante è sapere quello che si fa :). Ti faccio notare solo tre cose e poi taccio:
  • Non è così complicato immaginare un metodo privato:

    Codice: Seleziona tutto

    sanityCheck(int x)
    {
       if ( persona[x] == NULL) 
        persona[x]=new Persona();
     }
    da invocare all'inizio di ogni metodo della classe che fa uso della variabile privata 'persona'.
    Tu preferisci allocare tutte le persone una sola volta, io preferisco allocare una persona quando serve. Punti di vista, tu preferisci consumare RAM, io preferisco consumare tempo di CPU (il che, considerato che siamo sotto JVM, non è neanche poco).
  • Con la soluzione proposta non c'è errore, semplicemente perchè lo si è pensato prima :)
  • Che ne sai tu di che farebbe un 'programmatore client' ;). Un altra soluzione è quella di lasciare tutto come sta e di indicare come prerequisito dei metodi il fatto che persona[x] debba essere diversa da NULL.
Notte,
Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
raffaele181188
Packager
Packager
Messaggi: 789
Iscritto il: ven 7 set 2007, 21:40
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu
Località: DearSkin (FG)

Re: [java] NullPointerException ?

Messaggio da raffaele181188 »

@spina sì infatti queste sono discussioni senza fine :D, e poi credo di non essermi nemmeno spiegato bene. E' che personalmente non impazzisco per cose tipo "Prima di fare questo devi invocare quest'altro metodo" oppure "se scrivi un nuovo metodo ricordati, all'inizio, di inserire la chiamata a questo controllo", perchè più volte mi è capitato di dimenticarmene e fare casini. Forse una soluzione intermedia potrebbe essere ribattezzare setNome() "public nuovaPersona(String nome)" e fare come dici tu, ma come ho già scritto qui manca un po' la fase di progetto. Solo che prova ad immaginare di attuare la tua soluzione con il suo esempio: mettiamo in ogni metodo la chiamata al tuo metodo privato di controllo. Poi nel main() di Principale creiamo 5 persone e per ognuna chiamiamo setNome() setCognome() e setIndirizzo(). In questo caso il metodo privato controlla per 15 volte che il reference persona[x] sia non-null, il che è perfettamente inutile in 12 occasioni, visto che il controllo lo fa già setNome(). Certo, non è che ci siano secoli di overhead, però immagina con milioni di nominativi... E poi io al programmatore-client ci penso sempre :D , è la spinta decisiva a scrivere codice pulito, chiaro e leggibile. Se solo chi scrive il codice può modificarlo allora c'è qualcosa che non va (e noi non saremmo qui sulla Slackware :p )

Ho fatto la prova

Codice: Seleziona tutto

public class StringTest {
   public static void main(String... args) {
      //Creiamo due oggetti String con contenuto IDENTICO
      String first = "abc-xyz";
      String second = "abc-xyz";
      //A questo punto i references dovrebbero essere diversi (dal momento che questa sintassi implica un new String(), ma
      System.out.println("first.equals(second): " + first.equals(second) );
      System.out.println("first == second : " + (first == second) );
   }
}
Diamo un bel javac StringTest.java && java StringTest, ed ecco l'output

Codice: Seleziona tutto

first.equals(second): true
first == second : true
Quindi, in Java, == e equals() restituiscono lo stesso risultato (ma SOLO per le Stringhe, la spiegazione che ho dato prima potrebbe essere valida, solo che non ricordo dove l'ho letto quindi non posso controllare. Se qualcuno sa, si faccia avanti). E io credo che sia meglio usare == per una questione di leggibilità.

Avatar utente
raffaele181188
Packager
Packager
Messaggi: 789
Iscritto il: ven 7 set 2007, 21:40
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu
Località: DearSkin (FG)

Re: [java] NullPointerException ?

Messaggio da raffaele181188 »

@spina non voglio affatto che taci, ci mancherebbe... i forum servono per imparare: critiche e consigli sono sempre i benvenuti. Tra l'altro ho letto molti tuoi interventi qui nel forum e mi sono fatto l'idea di una persona davvero competente, quindi spero vorrai continuare la discussione. Qui nel mio ambiente non conosco nessuno abbastanza intelligente da discuterci, ben vengano le discussioni (anche di gusto e stile) su slacky

@neongen hai scritto una cosa riferita ad un post che ho cancellato. In realtà l'ho modificato, ma ne approfitto per chiederti come funziona la cosa su questo forum. Quand modifichi o elimini un post non esce scritto da qualche parte, così che gli altri utenti possano saperlo? Ho letto quanto c'era da leggere, ma vorrei un riscontro "sul campo"...

Avatar utente
neongen
Packager
Packager
Messaggi: 827
Iscritto il: ven 25 mag 2007, 12:37
Nome Cognome: Enrico
Slackware: 14.0_64
Kernel: 3.4.4
Desktop: KDE 4.5.5
Distribuzione: Maemo 5
Contatta:

Re: [java] NullPointerException ?

Messaggio da neongen »

raffaele181188 ha scritto: Ho fatto la prova

Codice: Seleziona tutto

public class StringTest {
   public static void main(String... args) {
      //Creiamo due oggetti String con contenuto IDENTICO
      String first = "abc-xyz";
      String second = "abc-xyz";
      //A questo punto i references dovrebbero essere diversi (dal momento che questa sintassi implica un new String(), ma
      System.out.println("first.equals(second): " + first.equals(second) );
      System.out.println("first == second : " + (first == second) );
   }
}
Diamo un bel javac StringTest.java && java StringTest, ed ecco l'output

Codice: Seleziona tutto

first.equals(second): true
first == second : true
Quindi, in Java, == e equals() restituiscono lo stesso risultato (ma SOLO per le Stringhe, la spiegazione che ho dato prima potrebbe essere valida, solo che non ricordo dove l'ho letto quindi non posso controllare. Se qualcuno sa, si faccia avanti). E io credo che sia meglio usare == per una questione di leggibilità.
allora il comportamento del tuo test sopra è esattamente come ci si aspetta che funzionino le cose (rileggiti i tuoi post che avevi cominciato bene), e infatti sia per una questione di leggibilità che per tutto quanto detto sopra... le stringhe in java vanno confrontate con '.equals()'

per l'altra cosa... tu (raffaele) hai inviato il post, io pure ho premuto su invia e mi ha visualizzato il nuovo messaggio scritto da te, quindi ho avuto la possibilità di aggiornare il mio alla luce di quel nuovo post ma quando ho premuto di nuovo su invia tu lo avevi già cancellato. tutto qui. non credo dovrebbe esserne rimasta traccia

Rispondi