Problemi con il metodo .substring() e con .length()

di il
4 risposte

Problemi con il metodo .substring() e con .length()

Buonasera, volevo sottoporvi questo mio fardello:
Sto lavorando ad una rubrica in java, l'ho organizzata in tre bottoni: il primo ti permette di inserire nuovi contatti(registrati su un .txt); il secondo apre una finestra con tutti i contatti presenti in rubrica e il terzo permette di cercare tramite l'input del nome le info su quel contatto, ed è proprio quest'ultimo che mi da problemi, vi posto la prova che sto facendo:
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.*;
public class Prova3
{
    public static void main(String ars[]) 
    {
        try
        {
            FileReader fReader1= new FileReader("C:/Elenco_Contatti.txt");
            BufferedReader reader = new BufferedReader(fReader1);
            String line = reader.readLine();
            String cNome=JOptionPane.showInputDialog("inserisci un nome presente in rubrica");
            while(line!=null)
            {
                line=reader.readLine();
                String prova=line;
                String analizzata=prova.substring(0,(cNome.length()));
                while(analizzata.toLowerCase().equals(cNome))
                {
                    JFrame frame1= new JFrame("Ricerca terminata con successo!");
                    JPanel content1= new JPanel();
                    frame1.add(content1);
                    JLabel label1= new JLabel(line);
                    frame1.setSize(400, 150);
                    frame1.setLocation(455,0);
                    frame1.setVisible(true);
                    String inutile=JOptionPane.showInputDialog("premi ok");
                    System.exit(0);
                }
                JFrame frame2= new JFrame("Errore:");
                JPanel content2= new JPanel();
                frame2.add(content2);
                JLabel label2= new JLabel("Contatto non trovato");
                content2.add(label2);                
                frame2.setSize(400, 150);
                frame2.setLocation(455,0);
                frame2.setVisible(true);
                String inutile=JOptionPane.showInputDialog("premi ok");
                System.exit(0);
            }
             
        }
        catch(IOException e) 
        {
            e.printStackTrace();
        }
    }
}
il problema sorge durante l'esecuzione dandomi questo errore:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5
	at java.lang.String.substring(Unknown Source)
	at Prova3.main(Prova3.java:19)

Processo terminato... ci sono problemi.
Credo dipenda da il cNome.length() ma non so come fare a risolvere
Grazie in anticipo a chi mi risponderà ^^

4 Risposte

  • Re: Problemi con il metodo .substring() e con .length()

    Esattamente, l'istruzione che da problemi è proprio:
    String analizzata=prova.substring(0,(cNome.length()));
    Il problema è dovuto al fatto che length restituisce la lunghezza della stringa, ma poiché i caratteri vengono conteggiati a partire dallo 0, allora l'ultimo carattere avrà posizione (length-1).

    Ad esempio la stringa "ciao" ha lunghezza 4, ma la lettera "o" ha posizione 3 (c=0, i=1, a=2, o=3).

    Se quello che vuoi ottenere è l'eliminazione del carattere "\n" puoi fare in (almeno) due modi:
    String analizzata=prova.substring(0,(cNome.length()-1));
    //oppure
    String analizzata=prova.replace("\n", "");
  • Re: Problemi con il metodo .substring() e con .length()

    Della ha scritto:


    Se quello che vuoi ottenere è l'eliminazione del carattere "\n" puoi fare in (almeno) due modi:
    String analizzata=prova.substring(0,(cNome.length()-1));
    //oppure
    String analizzata=prova.replace("\n", "");
    Ho provato a utilizzare la prima stringa, ma invece di out of range: 5 mi da 4, per la seconda non ho capito come dovrei usarla, nel senso che se sostituisco la mia string analizzata con quello che hai detto tu ottengo, ne ottengo una che contiene tutta la stringa prova e non quello che serve a me, ovvero solo il nome, per questo ricorrevo al substring, quello che vorrei fargli fare è:
    1. ricevi un nome in input;
    2.leggi la prima linea dal documento;
    3.estrai una substring dalla linea della lunghezza del nome ricevuto in input;
    4.confronta i contenuti dell'input e della substring;
    ...
    Spero di essermi spiegato, grazie della risposta
    EDIT:
    In oltre l'out of range me lo da della stessa lunghezza del nome che provo a cercare
    esempio: scrivo "nello" e mi da 5, scrivo "dfj" e mi da 3 (ovviamente i contatti con questi nomi ci sono nel documento di testo)
  • Re: Problemi con il metodo .substring() e con .length()

    No scusa, in realtà avevo capito un'altra cosa

    Comunque il procedimento in realtà è corretto, ma per sapere se funziona bisogna vedere com'è strutturato il file..
    Supponendo comunque che tutto sia strutturato coerentemente, forse il problema è dato dal fatto che tu esegui 2 volte una readLine, per cui ti perdi la prima riga, e forse la seconda riga è vuota, di conseguenza la variabile prova avrà lunghezza 0!

    Se il tuo file è composto da righe con una struttura ben determinata (es cognome nome numero) puoi usare le espressioni regolari per isolare solamente quelle parti che ti interessano (ad esempio il cognome)
  • Re: Problemi con il metodo .substring() e con .length()

    Della ha scritto:


    Supponendo comunque che tutto sia strutturato coerentemente, forse il problema è dato dal fatto che tu esegui 2 volte una readLine, per cui ti perdi la prima riga, e forse la seconda riga è vuota, di conseguenza la variabile prova avrà lunghezza 0!
    )
    Eliminare il readLine ha fatto si che il programma funzioni sulla prima riga dell'elenco, mentre se inserisco il nome della seconda riga mi dice Contatto non trovato. Secondo te può essere un problema legato ai cicli e a come li uso?
    p.s. il file è strutturato in modo che la prima "info" della riga sia sempre il nome.
    EDIT:
    Ho risolto, mi sono accorto che nel button listener in cui facevo inserire i contatti aggiungevo un carattere all'inizio, il carattere "\n" quindi non era mai uguale dal secondo in poi avendo all'inizio quel carattere, sono uno stupido ahahah comunque grazie mille per il tuo aiuto
Devi accedere o registrarti per scrivere nel forum
4 risposte