Richiesta errore programma

di il
19 risposte

Richiesta errore programma

Usando Netbeans non riesco a risolvere questo errore del programma:
se lo faccio girare mi restituisce sola la prima riga del testo e poi mi da il seguente errore ma non riesco a capire perchè vada fuori indice e come aggiustarlo.
Qualcuno può darmi una mano?
Grazie
  Quant’è bella giovinezza,
25
n

a1= 110


0
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 3
	at java.lang.String.charAt(String.java:658)
	at test_crittura.main(test_crittura.java:37) 
 import java.util.Scanner;  
import java.io.File;  

public class test_crittura {
    public static void main(String[] args) {
        int aaa=(int)'f'-48; 
      char[] chiave1;  
      chiave1= new char[8]; 
      aaa=aaa + 1;
      System.out.println("a = " + aaa + "\n");
    try{
        File prova1= new File("prova.txt");
        Scanner input= new Scanner(prova1);
        try(PrintWriter output= new PrintWriter("outprova.txt")) 
        {while(input.hasNextLine()) 
        {String riga= input.nextLine();
         System.out.println(riga);
         output.println(riga);
        System.out.println(riga.length());
        System.out.println(riga.charAt(3)+ "\n"); 
        char a = riga.charAt(3);
        int a1 = (int)a; // codifica in caratteri ascii
        System.out.println("a1= " + a1 + "\n");
        }
        }
       }
    catch(FileNotFoundException exc)
    {
     System.out.println("il file di input non esiste " + exc + "\n");    
    }
  }
 }  

19 Risposte

  • Re: Richiesta errore programma

    aletzunny ha scritto:


    se lo faccio girare mi restituisce sola la prima riga del testo e poi mi da il seguente errore ma non riesco a capire perchè vada fuori indice e come aggiustarlo.
    Se nel file hai (come mi pare evidente) una riga con meno di 4 caratteri, allora riga.charAt(3) ovviamente non lo puoi fare.
    Quindi cosa intendi fare con tali righe? Cosa c'è di "importante" per te al 4° carattere della riga?


    P.S. il codice è strutturato male ed è poco leggibile.
  • Re: Richiesta errore programma

    Salve! Il programma è stata passato così dall'insegnante e bisognava modificare il testo inserito.
    La mia scelta è stata questa:
    Quant’è bella giovinezza,
    
    che si fugge tuttavia!
    
    chi vuol esser lieto, sia:
    
    di doman non c’è certezza. 
    Ma
    char a=riga.charAt(3)
    Non dovrebbe stampare solo la terza lettera di ogni riga, quindi in ordine
    n
    s
    v
    o

    Forse non ho allora capito il funzionamento di
    charAt()
    Grazie
  • Re: Richiesta errore programma

    aletzunny ha scritto:


    Quant’è bella giovinezza,
    
    che si fugge tuttavia!
    
    chi vuol esser lieto, sia:
    
    di doman non c’è certezza. 
    Forse non ho allora capito il funzionamento di
    charAt()
    No, il problema non è tanto il charAt. Se il testo è scritto proprio così nel file come l'hai postato .... vedi che ci sono righe vuote?
    Se la riga è vuota, non hai caratteri sufficienti. Vuoi scartarle? Basta testare la lunghezza della stringa. Tutto qui.
  • Re: Richiesta errore programma

    Dunque se ho capito potrei o cancellare gli spazio tra le righe del testo oppure inserire un
    if(riga.lenght() !=0 
    allora stampa il carattere?
  • Re: Richiesta errore programma

    Ho inserito l'if e il codice funziona! Grazie.

    invece come potrei fare per riempire chiave1 con gli elementi trovati nel while?

    Grazie
  • Re: Richiesta errore programma

    aletzunny ha scritto:


    invece come potrei fare per riempire chiave1 con gli elementi trovati nel while?
    Devi tenere una variabile di "indice", inizialmente 0. Estrai il carattere e lo assegni nell'array usando l'indice che poi incrementi.

    Hai fatto new char[8] quindi ovviamente max 8 righe.
  • Re: Richiesta errore programma

    Siccome le righe sono 4 ho creato un array di lunghezza 4 e ho provata ad aggiungere un
    ciclo for
    ma mi viene stampato solo l'ultimo valore, cioè
    dddd
    .
    e non capisco come risolvere.
    Grazie
    import java.util.Scanner;  
    import java.io.File;  
    
    public class test_crittura {
        public static void main(String[] args) {
            int aaa=(int)'f'-48; 
          char[] chiave1;  
          chiave1= new char[5]; 
          aaa=aaa + 1;
          System.out.println("a = " + aaa + "\n");
        try{
            File prova1= new File("prova.txt");
            Scanner input= new Scanner(prova1);
            try(PrintWriter output= new PrintWriter("outprova.txt")) 
            {while(input.hasNextLine()) //has.netxline() 
            {String riga= input.nextLine();
             System.out.println(riga);
             output.println(riga);
            if(riga.length()!=0) +
            {
             System.out.println(riga.length());
             System.out.println(riga.charAt(3)+ "\n"); 
             char a = riga.charAt(3); 
             int a1 = (int)a; 
             System.out.println("a1= " + a1 + "\n");
             for(int i=0;i<chiave1.length;i++)
             {
              chiave1[i]=riga.charAt(3);
              System.out.print(chiave1[i]);
             }
            }
            }
            }
           }
        catch(FileNotFoundException exc)
        {
         System.out.println("il file di input non esiste " + exc + "\n");    /
        }
      }
     }
    
      
  • Re: Richiesta errore programma

    aletzunny ha scritto:


             for(int i=0;i<chiave1.length;i++)
             {
              chiave1[i]=riga.charAt(3);
              System.out.print(chiave1[i]);
             }
    Il for così non ha senso. Perché il carattere di una riga lo metti a tutte le posizioni nell'array. Primo, non ha senso. Secondo, così facendo solo il carattere dell'ultima riga lo tieni (e ripeto, mettendolo su tutto l'array!).

    Prima NON ti ho detto di usare un for. Un for andrebbe bene se conosci a priori il numero di righe disponibili. Se non lo sai ci sono altri modi:
    int i = 0;
    while (input.hasNextLine() && i < chiave1.length) {
        .......
    }
    E l'indice lo incrementi (ovviamente) solo se la riga è quella da trattare.
  • Re: Richiesta errore programma

    Mi perdoni ma sono alle prime armi con la programmazione e sto capendo davvero poco.
    questo while dove andrebbe messo nel mio programma?
    inoltre ho provato a continuare il while ma non sono riuscito a completarlo.
     int i=0;
    while(input.hasnextLine() && i<chiave1.length)
    
        { if(riga.length() != 0)
          {
            chiave1[i]= riga.charAt e poi?
          }
        }
    
    
    Grazie
  • Re: Richiesta errore programma

    aletzunny ha scritto:


    Mi perdoni ma sono alle prime armi con la programmazione e sto capendo davvero poco.
    questo while dove andrebbe messo nel mio programma?
    Il while è quello che già stavi facendo .... ho solo aggiunto la condizione in più che l'indice non superi la lunghezza dell'array.
    Ovvero il ciclo termina o perché sono finite le righe ... o perché non c'è più spazio nell'array. La prima situazione che arriva prima ..

    Comunque, molto abbozzato:
    
    int i = 0;
    while (input.hasNextLine() && i < chiave1.length) {
        //leggi la riga con nextLine()
        //la riga non è vuota?
            //allora estrai il carattere e lo assegni nell'array a [i], poi incrementi l'indice i
    }
    
    Con ovviamente il resto che hai già fatto.
  • Re: Richiesta errore programma

    Sperando di aver capito ho provato a modificare il programma con i suoi suggerimenti. é corretto?
    inoltre il
    System.out.println(chiave1
    messo fuori dal while affinchè stampi tutto l'array chiave1 è corretto?
    Grazie


    import java.util.Scanner;
    import java.io.File;

    public class test_crittura {
    public static void main(String[] args) {
    int aaa=(int)'f'-48;
    char[] chiave1;
    chiave1= new char[5];
    aaa=aaa + 1;
    System.out.println("a = " + aaa + "\n");
    try{
    File prova1= new File("prova.txt");
    Scanner input= new Scanner(prova1);
    try(PrintWriter output= new PrintWriter("outprova.txt"))
    {while(input.hasNextLine() && i<chiave1.length)
    {String riga= input.nextLine();
    System.out.println(riga);
    output.println(riga);
    if(riga.length()!=0)
    {
    System.out.println(riga.length());
    System.out.println(riga.charAt(3)+ "\n");
    char a = riga.charAt(3);
    int a1 = (int)a;
    System.out.println("a1= " + a1 + "\n");
    chiave1 = riga.charAt3;
    }
    }
    }
    System.out.println(chiave1);
    }
    catch(FileNotFoundException exc)
    {
    System.out.println("il file di input non esiste " + exc + "\n"); /
    }
    }
    }

    [/code]
  • Re: Richiesta errore programma

    aletzunny ha scritto:


    Sperando di aver capito ho provato a modificare il programma con i suoi suggerimenti. é corretto?
    No, non ancora. Intanto non hai incrementato i.
    Inoltre hai scritto:

    chiave1 [i]= riga.charAt3;

    ma forse volevi scrivere

    chiave1 [i]= riga.charAt(3);

    in ogni caso, il carattere lo hai già messo in a quindi puoi benissimo fare:

    chiave1[i] = a;

    Anche il resto comunque si può scrivere meglio, sia come stile che come approccio. Ad esempio anche lo Scanner lo puoi mettere come "resource" nel try-with-resource.

    aletzunny ha scritto:


    inoltre il
    System.out.println(chiave1
    messo fuori dal while affinchè stampi tutto l'array chiave1 è corretto?
    È giusto ma solo perché esiste un println(char[] x) che è specifico per un char array e stampa appunto i caratteri come ci si aspetta. In generale gli array non ridefiniscono il toString(), rimane quello "ereditato" da Object.
  • Re: Richiesta errore programma

    Grazie.
    Quindi trattandosi di un
    char array
    posso scrivere semplicemente
    system.out.println(chiave1)

    Ho capito bene?
  • Re: Richiesta errore programma

    aletzunny ha scritto:


    Quindi trattandosi di un
    char array
    posso scrivere semplicemente
    system.out.println(chiave1)
    Sì, esatto per un char[] il println è appropriato.
Devi accedere o registrarti per scrivere nel forum
19 risposte