String index out of range

di il
32 risposte

32 Risposte - Pagina 2

  • Re: String index out of range

    Fulvio, ok per il tuo progetto, ma credo che quello che ci serva più di ogni altra cosa sia più codice.

    Comunque se la funzione di match ti funziona perfettamente ma ti da l'errore citato sull'oggetto torno a ridire la stessa cosa che ti ho detto un paio di post precedenti, anzi ti traduco l'errore, e cerco di commentare la mia logica:

    String index out of range , senza googlare mi sembra dica: Indice della stringa fuori range/portata .
    Ora se avessi lo stack dell'errore e sapessi a che altezza si blocca l'applicazione sarebbe più semplice, ma a occhio le operazioni dove gestisci il range degli array sono due:
    for(i=0;i<contaLibri;i++)
    compara = Libreria[i].substring(0, ricerca.length());
                            if (compara.equalsIgnoreCase(ricerca) == true)
    Domandona, hai provato a cambiare il codice come suggerito sia da Xneo che da Ansharja ? Sopratutto quello di Ansharja:
    if (libreria [i].startsWith (ricerca)) // fai quello che vuoi ...


    Comunque, siccome ti voglio bene ho provato il tuo codice:
    package com.marktech.seriale;
    
    public class Main {
    
        public static void main(String[] args) {
    	// write your code here
    
            int contaLibri = 4;
            String ricerca = "provalolla";
            String[] Libreria = {"ciao","mondo","porcogiuda","diamine"};
    
            int i;
            for(i=0;i<contaLibri;i++)
            {
                System.out.println(i+"\t"+ricerca+"\t"+Libreria[i]+"\t"+Libreria[i].length());
                String compara;
                compara = new String();
                compara = Libreria[i].substring(0, ricerca.length());
                if (compara.equalsIgnoreCase(ricerca) == true)
                {
                    System.out.println("TROVATO!");
    //                        break;
                }//                    else popolaAreaTestoLibriNonTrovati(righeNonTrovate, ricerca);
            }
        }
    }
    
    #### STACK ####
    
    
    0	provalolla	ciao	4
    Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 10
    	at java.lang.String.substring(String.java:1963)
    	at com.marktech.seriale.Main.main(Main.java:18)
    
    Process finished with exit code 1
    
    


    ORA!!! ho voglia di tirarti le orecchie perchè usando il codice con la pulizia suggerita nei primi """2""" post ecco il risultato:
    
    package com.marktech.seriale;
    
    public class Main {
    
        public static void main(String[] args) {
    	// write your code here
    
            int contaLibri = 4;
            String ricerca = "provalolla";
            String[] libreria = {"ciao","mondo","porcogiuda","diamine"};
    
            int i;
            for(i=0;i<contaLibri;i++)
            {
                System.out.println(i+"\t"+ricerca+"\t"+libreria[i]+"\t"+libreria[i].length());
    
                if (libreria [i].startsWith (ricerca))
                {
                    System.out.println("TROVATO!");
                           
                }                  
            }
        }
    }
    
    
    
    ###Stack###
    
    
    0	provalolla	ciao	4
    1	provalolla	mondo	5
    2	provalolla	porcogiuda	10
    3	provalolla	diamine	7
    
    Process finished with exit code 0
    
    Ci devi un caffè se funziona!
  • Re: String index out of range

    L'ho rifatto anche mettendo "provalolla" nell'array libreria, e mi compare "TROVATO"
  • Re: String index out of range

    Ti ringrazio per aver preso a cuore il mio "caso", ma ti devo chiedere di spiegarmi cosa testa l'istruzione:
    
    if (libreria [i].startsWith (ricerca))
                {
                    System.out.println("TROVATO!");
                           
                }  
    
    ora cmq il codice di confronto è il seguente:
    
                for(int i=0;i<contaLibri;i++)
                    {
                    boolean compara = Libreria[i].regionMatches(true,0,ricerca,0,ricerca.length());
                        if (compara==true) 
                        {
                        System.out.println(i+"\t"+ricerca+"\t"+Libreria[i]+"\t"+"LIBRO TROVATO!");
                        i=contaLibri;
                            LT=true;
                        }                 
                    }
    
    Probabilmente NON ho capito qualcosa, ti spiace spiegarmelo?

    Ciao e Grazie in anticipo

    Fulvio
  • Re: String index out of range

    Ho riletto tutti i post, con maggiore attenzione e credo di aver capito che gli errori siano nel mio modo di scrivere il codice.
    Quindi per farla breve, al posto di
    
            int inizioAutore = 0;        
            int fineAutore = record.indexOf('\u002D');
            String Autore = record.substring(inizioAutore, fineAutore - 1);
    
    cosa dovrei scrivere per rispettare la sintassi Java e gestire il caso che NON vengano trovate le occorrenze cercate?

    Ciao e Grazie in anticipo per tutto l'aiuto possibile

    Fulvio
  • Re: String index out of range

    Puoi gestire tutto con un Try Catch, catturando l'errore che ne esce fuori e gestendolo. Un buon programma è un programma che non si blocca mai! Questo è possibile anche grazie a questo blocco magico!
  • Re: String index out of range

    Allora, proviamo a risolvere una volta per tutte il problema.
    Tu hai un file, libri.txt. Ogni riga di questo file contiene informazioni su un libro. Ad esempio potrebbe essere fatto così:
    DICKENS, CHARLES, OLIVER TWIST, 8807901544
    TOLKIEN, JOHN RONALD REUEL, LO HOBBIT, 8807901474
    ...

    Cioè ogni riga è formata da
    COGNOME AUTORE, NOME AUTORE, TITOLO, ISBN

    Quindi è MOLTO IMPORTANTE il formato di ogni riga, che sicuramente nel tuo caso sarà diverso da quello che ti ho mostrato.

    Quello che devi cercare di fare, adesso, è estrarre riga per riga il contenuto del file in base a come è formattato. Questa operazione è molto semplice se utilizzi la Stream API introdotta con Java 8; però non voglio confonderti le idee per il momento (nel caso fossi curioso fallo sapere).

    List<String> righe=null;
    try {
      righe=Files.readAllLines("libri.txt", Charset.forName("UTF-8");
    }catch(IOException e) {righe=new ArrayList<>();}
    La lista righe contiene ora tutte le righe del file sotto forma di stringhe.
    NB: Potresti leggere il file usando un BufferedReader o altro, alla fine dovresti avere come risultato sempre una lista (o eventualmente un array se sai a priori quanto è righe ci sono nel file) di stringhe che contiene tutte le righe del file.

    Ora hai 2 strade che puoi percorrere:
    1) Lavori con le stringhe in modo "grezzo" (sconsigliato)
    2) "Trasformi" le stringhe in un oggetto Libro.

    Io percorrerei la seconda strada, quindi mi scrivo una bella classe Libro.java in questo modo
    public class Libro {
        //variabili d'istanza
        ...
        public Libro(String nomeAutore, String cognomeAutore, String titolo, String ISBN) { ... }
        ...
        //metodi getter e setter
        ...
        
        //equals(), toString() e hashCode(). NB: ridefinisci l'equals in modo da stabilire il criterio per cui due libri siano uguali
        //ad esempio se hanno lo stesso autore e lo stesso titolo
    }
    A questo punto faccio la conversione Stringa-Libro
    List<Libro> libri=new ArrayList<>();
    for(String riga: righe) {
        String[] contenutoRiga=riga.trim().split(", ");
        //trim() rimuove eventuali spazi all'inizio e alla fine della riga
        //split(", ") divide la stringa in sottostringhe che sono separate da ", "(cioè virgola seguita da uno spazio); restituisce un array
        String cognome=contenutoRiga[0];
        String nome=contenutoRiga[1];
        String titolo=contenutoRiga[2];
        String ISBN=contenutoRiga[3];
    
        Libro libro=new Libro(nome, cognome, titolo, ISBN);
        libri.add(libro);
    }
    Ok, ora hai una lista di oggetti di tipo Libro.

    A questo punto viene il bello, cioè controllare se un libro è presente nella libreria.
    Cosa c'è dentro l'array Libreria? Stringhe? Probilmente si. In che formato? Probabilmente lo stesso usato nella riga del file.
    La situazione ideale a questo punto sarebbe che l'array Libreria anzichè contenere stringhe contenesse oggetti di tipo Libro, in questo modo potresti tranquillamente scrivere
    for(Libro l1: libri) {
        boolean trovato=false;
        for(Libro l2: Libreria) {
            if(l1.equals(l2)) { trovato=true; break; //il libro è presente nella libreria }
        }
        if(!trovato) //il libro non è presente }
    }
    Problema risolto. Non ti devi barcamenare ne con substring(), ne con indici di array, ne con regionMatches() (che tra l'altro io non ho avuto mai il bisogno di usare).

    Comunque il tuo array Libreria contiene stringhe, devi usare lo stesso procedimento per convertire la stringa in un oggetto di tipo libro.

    Quindi riepilogando:
    1) Leggi il file e ottieni una lista di stringhe List<String>
    2) Dividi ogni stringa della lista in base al formato e ottieni una lista di array di stringhe List<String[]> [*]
    3) Converti ogni array di stringhe in un oggetto di tipo Libro e ottieni una lista di libri List<Libro>
    4) Segui il passi 2) e 3) per la libreria
    5) Usa il metodo equals() ridefinito in Libro per controllare se un libro è presente nella libreria


    [*] Per dividere la stringa che rappresenta la riga, in questo esempio, ho usato il metodo split(). In questo e in molti altri casi va più che bene. Altrimenti esiste la classe StringTokenizer, o addirittura la classe StreamTokenizer, ma credo che per il momento non ti interessino.

    NBB: Tutto dipende da come è formato il file, quindi la parte più delicata di tutto il programma sta proprio nel dividere ogni riga in base al formato.

    EDIT: Non ho resistito, ti posto anche la soluzione utilizzando la Stream API
    try(Stream<String> righe=Files.lines("libri.txt") {
        righe.map(riga-> riga.split("; ")).
        map.(array -> new Libro(array[1], array[0], array[2], array[3])).
        filter(libro-> Stream.of(Libreria).anyMatch(l->l.equals(libro))).
        forEach(libro -> //fai qualcosa con il libro presente nella libreria);
    }
  • Re: String index out of range

    Belloooo! In effetti Fulvio, il tuo problema è proprio che è 30 anni che programmi e sei troppo legato alla programmazione sequenziale.
    Dovresti rivedere tutto sotto l'ottica della programmazione ad oggetti, invece ancora ti aggrappi al vecchio metodo di scrittura a quanto si è visto.

    Xneo a centrato in pieno. Ricostruisci il tuo programma più orientato agli oggetti e avrai molti meno problemi. Poi ti ha scritto metà del programma
  • Re: String index out of range

    Grazie Amici,
    anche se in verità sono riuscito soltanto a capire poco più di un terzo del codice scritto da @xneo.
    Voi siete troppo avanti e io troppo indietro e legato a schemi di programmazione sequenziale, dentro ai quali ogni tanto inserisco degli oggetti, che però non so esattamente gestire.
    Senza però uscire dal seminato, rimanendo cioè ancorato, almeno per ora ad uno schema vecchio di programmazione, se io implementassi dei controlli su ogni elemento che viene estratto dal file, trasformando:
    
    int inizioAutore = 0;        
            int fineAutore = record.indexOf('\u002D');
            String Autore = record.substring(inizioAutore, fineAutore - 1);
    
    in
    
    int inizioAutore;
    String Autore;
    int fineAutore;
    	if(record.indexOf('\u002D')>0)
    		{
    		fineAutore = record.indexOf('\u002D');
    		Autore = record.substring(inizioAutore, fineAutore - 1);
    		}
    	else Autore = "AUTORE NON VALIDO";	
    
    Così, non sarei già riuscito ad irrobustire un pochino il codice?

    Chiedo scusa in anticipo, ma il mio Java non prevede ancora l'uso dei Generics, degli ArrayList e delle Lambda Expression.
  • Re: String index out of range

    Allora a questo punto ci devi dire qual è il formato di una riga.
    Io ti ho fatto l'esempio COGNOME_AUTORE, NOME_AUTORE, TITOLO, ISBN.
    Potrebbe anche essere TITOLO - NOME_AUTORE - COGNOME_AUTORE. Potrebbe, visto che il carattere '\u002d' corrisponde al carattere '-'. Bisogna capire se ci sono spazi anche.

    Poi record cosa è, la stringa che rappresenta la riga? la stringa che rappresenta tutte le righe?
    Io parlo di righe ma non so neanche se il file è strutturato in righe, ma ogni "libro" potrebbe essere separato da altri da un carattere separatore diverso da'\n' (carriage return).
  • Re: String index out of range

    Bella domanda,
    peccato che la risposta non sia altrettanto bella.

    Le righe nelle quali è organizzato il file sono, purtroppo una combinazione di trattini, virgole, virgolette, underscore e punti.
    Io pensavo di riuscire ad organizzare l'estrazione dei dati in base ad un profilo del redattore dell'elenco, ma poi mi sono dovuto ricredere.
    Ad ogni modo, di seguito ho fatto un copia-incolla di alcune righe del file da analizzare:

    Abbas Kazerooni - Con le ali ai piedi (2014).rar - 3.4 MB
    Giorgio Ressel - 141° Reggimento e altre storie. Cinque racconti per chi ama l'avventura (2012).pdf - 1.6 MB
    Gordon Doherty – Il Legionario (2014).epub - 1.1 MB
    Valerio Lo Monaco - WEB e manipolazione delle MASSE. Come social e motori di ricerca alterano la percezione cognitiva (2016).rar - 3.2 MB

    Come puoi vedere pur assomigliandosi, può avere degli elementi diversi. Senza contare che per un altro redattore, l'elenco potrebbe essere scritto nel seguente modo:

    Charles_Dickens_-_Il_Circolo_Pickwick_(2011).epub - 2.3 MB
    Daniele_Gouthier_2C_Federica_Manzoli_-_Il_solito_Albert_e_la_piccola_Dolly._La_scienza_dei_bambini_e_dei_ragazzi_(2008).pdf - 1.1 MB
    Antonio_Sciotto_-_Sempre_pi_C3_B9_blu._Operai_nell_Italia_della_grande_crisi_(2011).epub - 1.5 MB
    Ir_C3_A8ne_N_C3_A9mirovsky_-_Giorni_d'estate_(2009).epub - 4.0 MB

    Io sto per gettare la spugna, se avete altri suggerimenti, Vi ascolto volentieri

    Ciao
    Fulvio
  • Re: String index out of range

    E questo è il metodo che ho scritto per eseguire il confronto
    
        @SuppressWarnings("empty-statement")
    //    public static void estraiDatiLibroDaElenco(String record) throws StringIndexOutOfBoundsException
        public static void estraiDatiLibroDaElenco(String record) throws NullPointerException
        {
    //      System.out.println(record);
    // Estrae il campo Autore dal record        
        try
            {    
    /*
            int inizioAutore = 0;        
            int fineAutore = record.indexOf('\u002D');
            String Autore = record.substring(inizioAutore, fineAutore - 1);
    */
            
    int inizioAutore = 0;
    String Autore;
    int fineAutore;
    // identifica il primo trattino tra Autore e Titolo
       if(record.indexOf('\u002D')>0)   
          {
          fineAutore = record.indexOf('\u002D');
          Autore = record.substring(inizioAutore, fineAutore - 1);
          }
       else Autore = "AUTORE NON VALIDO";        
            
    // Estrae il campo Titolo dal record
            int inizioTitolo = record.indexOf('\u002D');
            int fineTitolo = record.lastIndexOf('\u002D');
            String titoloSporco = record.substring(inizioTitolo + 2, fineTitolo - 2);
            int inizioEstensione = titoloSporco.lastIndexOf('\u002E');
            String Titolo = titoloSporco.substring(0, inizioEstensione - 7);
    
    // Estrae il campo Anno dal record
            int inizioAnno = titoloSporco.lastIndexOf('\u0028');
            int fineAnno = titoloSporco.lastIndexOf('\u0029');
            String Anno = titoloSporco.substring(inizioAnno + 1, fineAnno);
    
    // Crea un oggetto Libro che abbia come proprietà i dati appena raccolti
            Libro libroDaCercare = new Libro();
            libroDaCercare.setAutoreLibro(Autore);
            libroDaCercare.setTitoloLibro(Titolo);
            
                confrontaLibro(libroDaCercare);        
            }
            
            catch (NullPointerException NPEx){};
    //        catch (StringIndexOutOfBoundsException SEx) {};
        } 
        
        public static void confrontaLibro(Libro libroDaCercare)
        {
        System.out.println("INIZIO CONFRONTO");
    // Verranno confrontati tutti i caratteri che formano la stringa Autore - Titolo
            String Autore = libroDaCercare.getAutoreLibro();
            String Titolo = libroDaCercare.getTitoloLibro();
            String ricerca = Autore + " - " + Titolo;
    
    // Esempio di confronto con il metodo regionMatches()
    //      String s1 = "Pallone";
    //      String s2 = "Pallore";
    //      boolean b = s1.regionMatches(true, 2, s2, 2, 3); // true perché llo uguali
                
                for(int i=0;i<contaLibri;i++)
                    {
                    boolean compara = Libreria[i].regionMatches(true,0,ricerca,0,ricerca.length());
                        if (compara) 
                        {
                        System.out.println(i+"\t"+ricerca+"\t"+Libreria[i]+"\t"+"LIBRO TROVATO!");
                        i=contaLibri;
                            LT=true;
                        }                 
                    }
        }
    
    Le righe che sono commentate, lo sono o perché non riesco ad implementarle o perché, con o senza, il comportamento finale è lo stesso.
  • Re: String index out of range

    Nel primo caso, hai come separatore " - " (cioè spazio trattino spazio). Con il metodo split(" - ") risolvi il problema. L'unico problema nasce se questa combinazione di caratteri è presente nel nome dell'autore o nel titolo, qui non c'è nulla da fare, ti devi accertare tu che il file non sia malformato.

    Poi dici che a priori non sai come è composto il file, dipende dal redattore. A questo punto non esiste una soluzione unica al problema.
    Devi scriverti tante strategie per estrarre il file a seconda del redattore.

    Nel primo caso la soluzione comunque è questa:
    public static List<Libro> estraiLibri(String[] righe) {
        List<Libro> libri=new ArrayList<>();
        for(String riga: righe) {
            String[] campi=riga.trim().split(" - ");
            String autore=campi[0];
            String titolo=campi[1].substring(0, campi[1].lastIndexOf(' ')); //lastIndexOf(' ') restituisce l'indice dell'ultimo carattere spazio nel titolo
            //nell'esempio il titolo è "Con le ali ai piedi (2014).rar", substring(0, lastIndexOf(' ') restituisce la stringa "Con le ali ai piedi".
            String anno=campi[1].substring(campi[1]indexOf('(')+1, campi[1].indexOf(')');
    
            Libro libro=new Libro(autore, titolo, anno); //posto che hai un costruttore public Libro(String autore, String titolo, String anno)
    
            libri.add(libro); //aggiungo il libro alla lista dei libri estratti
        }
        return libri;
    }
    Allora il parametro String[] righe contiene le righe del file, quindi, in base all'esempio che hai postato, conterrà
    ["Abbas Kazerooni - Con le ali ai piedi (2014).rar - 3.4 MB", "Giorgio Ressel - 141° Reggimento e altre storie. Cinque racconti per chi ama l'avventura (2012).pdf - 1.6 MB", "Gordon Doherty – Il Legionario (2014).epub - 1.1 MB", "Valerio Lo Monaco - WEB e manipolazione delle MASSE. Come social e motori di ricerca alterano la percezione cognitiva (2016).rar - 3.2 MB"]
    il ciclo for mi consente di iterare su queste stringhe.

    L'array String[] campi è così formato:
    Iterazione 1: ["Abbas Kazerooni", "Con le ali ai piedi (2014).rar", "3.4 MB"]
    Iterazione 2: ["Giorgio Ressel", "141° Reggimento e altre storie. Cinque racconti per chi ama l'avventura (2012).pdf", "1.6 MB"]
    Iterazione 3: ["Gordon Doherty", "Il Legionario (2014).epub", "1.1 MB"]
    Iterazione 4: ["Valerio Lo Monaco", "WEB e manipolazione delle MASSE. Come social e motori di ricerca alterano la percezione cognitiva (2016).rar", "3.2 MB"]
    Ora analizzo solo la prima iterazione, il resto è uguale
    String autore=campi[0]; è "Abbas Kazerooni";
    String titolo=campi[1].substring(0, campi[1].lastIndexOf(' ')); è "Con le ali ai piedi";
    String anno=campi[1].substring(campi[1]indexOf('(')+1, campi[1].indexOf(')') è 2014;
    Libro libro=new Libro(autore, titolo, anno) si commenta da solo.
    L'unica cosa è che per stabilire se due libri sono uguali in base solo all'autore e al titolo, come ti avevo già scritto nel commento precedente, bisogna ridefinire equals in questo modo
    public boolean equals(Object o) {
        if(this==o) return true;
        if(!(o instaceof Libro)) return false;
        Libro l=(Libro)o;
        return l.autore.equals(autore) && l.titolo.equals(titolo); //oppure l.autore.equalsIgnoreCase(autore) && l.titolo.equalsIgnoreCase(titolo);
    }
    libri.add(libro); aggiunge il libro nella lista List<Libro> libri.

    alla fine di tutte le iterazioni, dopo che sei uscito dal ciclo for, return libri restituisce la lista dei libri.

    Adesso la stessa cosa devi fare con la libreria. L'array libreria (quella che tu chiami Libreria con la L maiuscola) deve contenere oggetti di tipo Libro. Se così fosse puoi scriverti un metodo come questo:
    public static boolean eNellaLibreria(Libro libro, Libro[] libreria)  {// oppure List<Libro> libreria
        for(Libro l: libreria) {
            if(l.equals(libro) return true;
        }
        return false;
    }
    a questo punto potresti avere un main così fatto
    public static void main(String[] args) {
        Libro[] libreria=...; //costruisciti la libreria
        String[] righe=... //leggi le righe dal file
        List<Libro> libriEstratti=estraiLibri(righe);
        for(Libro l: libriEstratti) {
            if(eNellaLibreria(l, libreria)) { //fai qualcosa con il libro che è presente nella libreria}
            else {//fai qualcosa con il libro che non è presente nella libreria}
        }
    }
    Questa è la soluzione. Già questa è una delle soluzioni più semplici. Ce ne sarebbero anche di più efficienti ma non voglio complicare troppo le cose. Ad esempio, per il secondo tipo di file io utilizzerei uno StringTokenizer, potrei lavorare anche "a mano" con indexOf(), lastIndexOf, ecc. ma sarebbe una faticaccia inutile.

    Poi dal codice che posti, avresti bisogno di approfondire meglio Java, pensare secondo il paradigma Object Oriented, alla separazione dei problemi in sottoproblemi, ecc.

    Più di così non so, e non posso aiutarti.
  • Re: String index out of range

    GRAZIE @xneo,
    è un'analisi a dir poco FANTASTICA!
    Come avevo capito dai tuoi post precedenti, avevo sbagliato approccio.
    Colpa della mia scarsa elasticità mentale e degli anni passati a programmare in maniera sequenziale.
    Sto leggendo, ormai da 2 anni, il libro Java8 di Principe Pellegrino, ma a volte non lo capisco. Mi sai consigliare qualche altro testo che parli della OOP ad esempio confrontandola con la programmazione sequenziale?
    Confesso che ho iniziato a conoscere Java nel 2002, attraverso un corso post diploma della durata di 900 ore, ma da allora ho potuto metterlo in pratica soltanto da pochi mesi, per necessità, più che altro.
  • Re: String index out of range

    Di testi ce ne sono molti, in italiano uno dei più consigliati è "Manuale di Java 8" di Claudio De Sio Cesari. In inglese un must have sono i due volumi di "Core Java" di Cay Horstmann.

    Tuttavia chiedi libri sulla OOP, o meglio che ti insegnino a pensare "ad oggetti", quindi non mi sento di consigliarteli.
    Secondo me un libro che ti potrebbe aiutare molto è "Lezioni di programmazione orientata agli oggetti in Java" del Prof. Libero Nigro, docente del corso di OOP all'Università della Calabria. Il libro è molto ricco di esempi accompagnati da commenti e spiegazioni teoriche. Copre quasi tutta la libreria di Java. I primi due capitoli sono un richiamo al corso di fondamenti di Informatica dove viene usata la programmazione procedurale. La versione Java su cui si basa il testo è la 7, poco male visto che Java 8 introduce delle funzionalità che riguardano la programmazione funzionale.
  • Re: String index out of range

    Ti ringrazio tantissimo e ancora complimenti per il tuo stile di programmazione!
    Non avevo idea che si potesse eseguire un confronto diretto tra due oggetti <Libro> senza dover necessariamente paragonare le proprietà in essi contenuti.
    E' sbalorditivo!
    Molto più avanti di dove sono io, per ora.
Devi accedere o registrarti per scrivere nel forum
32 risposte