String index out of range

di il
32 risposte

String index out of range

Ciao a tutti,
sono alle prese con un problema con il seguente frammento di codice: se elimino la condizione di test, ottengo la scansione di tutto l'array Libreria[], altrimenti quando l'indice i vale 4, incappo nell'errore indicato in oggetto.
Qualcuno sarebbe così gentile da spiegarmi il possibile motivo?

Grazie in anticipo
Fulvio
            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);                    
                }

32 Risposte

  • Re: String index out of range

    Prima cosa:
    
    String compara;
    compara=new String();
    compara=Libreria[i].substring(0, ricerca.length());
    
    è un crimine contro l'umanità. Scrivi
     String compara=Libreria[i].substring(0, ricerca.length()); 
    Seconda cosa
    if (compara.equalsIgnoreCase(ricerca) == true)
    
    si scrive come
     if (compara.equalsIgnoreCase(ricerca)) 
    
    "==true" è ridondante, superfluo e può portare a errori sottil.

    Terzo, se vuoi un aiuto concreto posta il codice giusto o la stacktrace, perchè dal codice che hai postato non si capisce nulla.

    Comunque provo a guardare nella sfera magica.
    Secondo me Libreria[4] contiene una stringa più corta della sottostringa che stai cercando di estrarre da essa.
    PS: In Java è convenzione che un identificatore di variabile inizi con una lettera minuscola, per cui anzichè "Libreria" l'array dovrebbe essere chiamato "libreria" con la elle iniziale minuscola.
  • Re: String index out of range

    Oltre a quanto giustamente detto da @xneo aggiungo che quello che stai tentando di fare (estarre da ogni elemento di libreria i primi n caratteri, con n lunghezza di ricerca, e vedere se coincidono con ricerca) equivale a testare il fatto che ogni elemento di libreria inizi con la stringa ricerca: questo puoi farlo semplicemente con il metodo della classe String :
    
    if (libreria [i].startsWith (ricerca)) // fai quello che vuoi ...
    
    Il vantaggio sta nella chiarezza, brevità, e soprattutto nel non dover più troncare gli elementi di libreria, eliminando il rischio della StringIndexOutOfBoundsException.

    Se vuoi mantenere il fatto di ignorare il maiuscolo/ minuscolo nel controllo, visto che non esiste un metodo startsWithIgnoreCase (almeno nei pacchetti standard, probabilmente altre librerie lo avranno implementato) , puoi usare il trucchetto di trasformare entrambe le stringhe in maiuscolo o minuscolo (solo per il controllo !).

    Quindi un' alternativa al codice di sopra è:
    
    if (libreria [i].toLowerCase ().startsWith (ricerca.toLowerCase ())) // fai quello che vuoi ...
    
  • Re: String index out of range

    Ciao a tutti,
    sarà anche come dite, ma l'unico metodo che non mi dà l'errore è regionMatches();

    Grazie cmq
    Fulvio
  • Re: String index out of range

    Ciao a tutti,
    sarà anche come dite, ma l'unico metodo che non mi dà l'errore è regionMatches();
    Sarà anche come dici, ma se fai una domanda su un forum almeno abbi la decenza di leggere le risposte e soprattutto capirle.
  • Re: String index out of range

    Riusciresti a postare il codice che non funziona?
    Per ora possiamo davvero fare solo divinazione ...

    Prepara qualcosa che sia pronto da compilare ed eseguire, con il minimo necessario a riprodurre il problema, se leggi la libreria da file o altro puoi inserire i valori direttamente nel sorgente (es String [] libreria = new String [] {"Primo titolo", "Secondo titolo ", ...} ), così vediamo cosa non va ...
  • Re: String index out of range

    Se, e dico SE, ho capito più o meno il tuo problema, ovvero che quando arrivi in fondo all'indice dell'array, ti esplode ogni cosa... è perchè potresti commettere uno degli errori più diffusi della storia dei nubbi (che non deve essere offensivo, ma tutti ci hanno sbattuto il muso almeno una volta) .

    Gli array iniziano a contare da 0, mentre tu probabilmente gli stai passando un valore che inizia a contare da 1. Quindi quando arriva a 4 e l'array è formato da ... 0,1,2,3 Elementi , al 4 la JVM di arrabbia di brutto.

    Oppure i è a 3, effettivamente passa la condizione IF, e procede ad incrementare il contatore, e tu stai chiedendo alla macchina di cercare nell'array l'indice appena incrementato a 4. Cosa molto molto cattiva!!!

    Xeno, sei proprio un cattivone

    Comunque tutti gli altri ti hanno dato dei deliziosi consigli sulla pulizia del codice, accettali, ti migliorerà la vita quando dopo un po di tempo ricominci a riguardare il codice in cerca di qualche pezzetto che ti farebbe comodo recuperare.
  • Re: String index out of range

    @MarkRider Nessuna cattiveria, ci mancherebbe.
    Solo che non sopporto quando mi si risponde a cipolle quando parlo di patate (dalla mie parti si dice così XD).
    Poi regionMatches() qui non lo ha nominato nessuno, al massimo il problema è substring() secondo quello che vedo nella sfera magica.
  • Re: String index out of range

    Ciao,
    rispondo a tutti gli intervenuti, dicendovi che la calma è la virtù dei forti e se ve la prendete per così poco, allora è meglio che facciate un bel respiro profondo, prima di parlare, (ovvero scrivere).
    Ad esempio come hanno fatto con me finora @andbin e @Ansharja di cui non solo stimo ed apprezzo la dote di programmatore, ma in primo luogo il fatto che siano persone estremamente educate e pazienti.

    Chiarito questo procediamo con ordine:

    Anche se sono neofita di Java, non vuol dire per questo che sia a digiuno di programmazione, quindi so bene che gli Array hanno un indice che parte da 0 e non da 1, cmq analizzerò meglio il metodo seguendo il consiglio di @Ansharja e vi comunicherò i risultati.

    Ciao e Grazie
    Fulvio
  • Re: String index out of range

    L'errore è "facile", ovvero la stringa che è in posizione 4 ha una dimensione minore rispetto alla stringa "ricerca". Inserisci un controllo (più tutte le cose dette prima) e dovresti risolvere
  • Re: String index out of range

    Ciao a tutti,
    analisi completata!

    Non si tratta di un problema dell'applicazione, ma di formattazione del file da elaborare.
    Se il file contiene un carattere esterno al set ASCII, esplode.

    Qualcuno di voi saputi (io programmo solo da 37 anni, prima in Cobol, poi in Basic ed ora in Java) mi sa consigliare in metodo che implementi un parsing dei caratteri basic ASCII?

    Ciao e Grazie in anticipo
    Fulvio
  • Re: String index out of range

    Questo punto la domanda è "come leggi il file?" (hai un atteggiamento leggermente spocchioso... di sicuro non invogli a farti aiutare!!!)
  • Re: String index out of range

    Giusto per capire, cosa intendi per esterno al set ascii, tipo la parola "è" ?
  • Re: String index out of range

    Ma qui non ci sono saputi, al massimo solo indovini che guardano nelle sfere magiche.
    Poi non fare il permaloso perchè i consigli che ti ho dato nella prima risposta ti permettono di scrivere codice più efficiente e di avere una risposta più precisa. Non prenderla sul personale.

    Comunque in Java un char è formato da 16 bit e utilizza la codifica UTF-16. Il set di caratteri ASCII è un sottoinsieme dei caratteri Unicode. I caratteri che fanno parte del set ASCII sono i primi 128 (da 0 a 127).

    Quindi devi accertarti che nel tuo file non ci siano caratteri non ASCII.

    Tutto ciò comunque mi sembra strano poichè potresti avere problemi se cerchi di lavorare (in modo legacy, passami il termine) con caratteri che utilizzano una codifica con un numero di bit maggiore di 16.
  • Re: String index out of range

    Come al solito è difficile farsi capire attraverso poche righe di testo, ma avrei voluto essere breve.
    Mi metto il cappello da somaro e provo a spiegarmi meglio, evitando troppe sintesi.

    Il mio intento è quello di leggere un'elenco di libri, ovvero un file che è il risultato di un copia-incolla da un'email in html in un semplice editor di testo, confrontarlo con una libreria già esistente, cioè l'elenco di tutti i titoli dei libri già presenti e determinare se il libro da esaminare è presente, oppure no.

    Dopo circa un mesetto di lavoro, a tempo perso, sono riuscito a mettere in piedi un programma che funziona a singhiozzi, cioè se il file rispetta la formattazione che ho analizzato, va, altrimenti ho l'errore di cui all'oggetto attraverso la generazione di un eccezione che purtroppo non riesco a catturare.

    Ho scritto un metodo che analizza il file riga per riga, ne ricava gli elementi importanti per il confronto, cioè Autore e Titolo e poi lo confronta con una libreria che è stata memorizzata in un array.

    Ho notato, facendomi fare la stampa delle stringhe lette ed elaborate, che il set dei caratteri del mio file .txt e quello che compare nella finestra di output di NetBeans IDE sono differenti e già non so se esiste un modo per renderli uguali. Inoltre mi sono accorto che l'errore che ho riportato in oggetto, compare solo se uno dei due elementi, cioè Titolo o Autore non viene correttamente intercettato poiché il formato della riga è difforme da quanto dichiarato nella TOR.

    Quindi mi chiedo e vi chiedo:

    - "Ho sbagliato l'implementazione dei metodi?"
    - "Anche se esistono delle specifiche di progetto, occorre sempre restare in campana e prevedere l'imprevedibile?"

    In che modo potrei risolvere questo tipo di problema? Potrebbe essere sufficiente implementare dei controlli che se non ricevono il formato riga presupposto, la evidenziano a video, così che l'utente ne sia avvisato e possa eventualmente digitarla a mano?

    Sono aperto a tutti i possibili suggerimenti.

    Ciao e Grazie
    fulvio
Devi accedere o registrarti per scrivere nel forum
32 risposte