Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    StringIndexOutOfBoundException --- possibili cause

    Salve a tutti, sto lavorando con delle stringhe in java e mi trovo di fronte a un problema.
    In fase di esecuzione mi viene restituita l'eccezione:

    StringIndexOutOfBoundException: String index out of range: 1

    La riga di codice che genera l'errore è del tipo:

    str1 += str2

    C'è qualcuno che sa darmi qualche possibile spiegazione ?
    Non ci sono Queen senza Freddie !

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: StringIndexOutOfBoundException --- possibili cause

    Originariamente inviato da music_ale
    StringIndexOutOfBoundException: String index out of range: 1

    str1 += str2
    Mi sembra strano (e non credo) che sia davvero questa la riga in cui lancia StringIndexOutOfBoundException.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Si, infatti poi ho visto che l'errore è dovuto alle seguenti funzioni che chiamo in un'altra funzione generale per convertire i caratteri HEX in ascii.

    str = str.replaceAll("24","$");
    str = str.replaceAll("5c","\\");

    Visto che ci sono, volevo sapere se in Java c'è un modo veloce per trasformare bytes esadecimali in ascii. Ho scritto il seguente obbrobbrio che, tra l'altro se applicato in cicli for di grosse dimensioni penso che mi rallenti l'esecuzione.

    public class HexToAsciiHelper
    {
    public static String exToAscii(String str)
    {
    // Altri caratteri
    str = str.replaceAll("20"," ");
    str = str.replaceAll("21","!");
    str = str.replaceAll("22","\"");
    str = str.replaceAll("23","#");
    // str = str.replaceAll("24","$");
    str = str.replaceAll("25","%");
    str = str.replaceAll("26","&");
    str = str.replaceAll("27","\'");
    str = str.replaceAll("28","(");
    str = str.replaceAll("29",")");
    str = str.replaceAll("2a","*");
    str = str.replaceAll("2b","+");
    str = str.replaceAll("2c",",");
    str = str.replaceAll("2d","-");
    str = str.replaceAll("2e",".");
    str = str.replaceAll("2f","/");

    str = str.replaceAll("3a",":");
    str = str.replaceAll("3b",";");
    str = str.replaceAll("3c","<");
    str = str.replaceAll("3d","=");
    str = str.replaceAll("3e",">");
    str = str.replaceAll("3f","?");
    str = str.replaceAll("40","@");

    str = str.replaceAll("5b","[");
    // str = str.replaceAll("5c","\\");
    str = str.replaceAll("5d","]");
    str = str.replaceAll("5e","^");
    str = str.replaceAll("5f","_");
    str = str.replaceAll("60","'");


    // Lettere maiuscole
    str = str.replaceAll("41","A");
    str = str.replaceAll("42","B");
    str = str.replaceAll("43","C");
    str = str.replaceAll("44","D");
    str = str.replaceAll("45","E");
    str = str.replaceAll("46","F");
    str = str.replaceAll("47","G");
    str = str.replaceAll("48","H");
    str = str.replaceAll("49","I");
    str = str.replaceAll("4a","J");
    str = str.replaceAll("4b","K");
    str = str.replaceAll("4c","L");
    str = str.replaceAll("4d","M");
    str = str.replaceAll("4e","N");
    str = str.replaceAll("4f","O");
    str = str.replaceAll("50","P");
    str = str.replaceAll("51","Q");
    str = str.replaceAll("52","R");
    str = str.replaceAll("53","S");
    str = str.replaceAll("54","T");
    str = str.replaceAll("55","U");
    str = str.replaceAll("56","V");
    str = str.replaceAll("57","W");
    str = str.replaceAll("58","X");
    str = str.replaceAll("59","Y");
    str = str.replaceAll("5a","Z");


    // Lettere minuscole
    str = str.replaceAll("61","a");
    str = str.replaceAll("62","b");
    str = str.replaceAll("63","c");
    str = str.replaceAll("64","d");
    str = str.replaceAll("65","e");
    str = str.replaceAll("66","f");
    str = str.replaceAll("67","g");
    str = str.replaceAll("68","h");
    str = str.replaceAll("69","i");
    str = str.replaceAll("6a","j");
    str = str.replaceAll("6b","k");
    str = str.replaceAll("6c","l");
    str = str.replaceAll("6d","m");
    str = str.replaceAll("6e","n");
    str = str.replaceAll("6f","o");
    str = str.replaceAll("70","p");
    str = str.replaceAll("71","q");
    str = str.replaceAll("72","r");
    str = str.replaceAll("73","s");
    str = str.replaceAll("74","t");
    str = str.replaceAll("75","u");
    str = str.replaceAll("76","v");
    str = str.replaceAll("77","w");
    str = str.replaceAll("78","x");
    str = str.replaceAll("79","y");
    str = str.replaceAll("7a","z");


    // Numeri
    str = str.replaceAll("30","0");
    str = str.replaceAll("31","1");
    str = str.replaceAll("32","2");
    str = str.replaceAll("33","3");
    str = str.replaceAll("34","4");
    str = str.replaceAll("35","5");
    str = str.replaceAll("36","6");
    str = str.replaceAll("37","7");
    str = str.replaceAll("38","8");
    str = str.replaceAll("39","9");

    str = str.replaceAll(" ","");


    return str;
    }
    }
    Non ci sono Queen senza Freddie !

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da music_ale
    str = str.replaceAll("24","$");
    No, con replaceAll() nella seconda stringa di replace il '$' è un carattere "speciale". Quindi dovresti mettere "\\$"

    Originariamente inviato da music_ale
    public class HexToAsciiHelper
    {
    public static String exToAscii(String str)
    {
    // Altri caratteri
    str = str.replaceAll("20"," ");
    str = str.replaceAll("21","!");
    str = str.replaceAll("22","\"");
    str = str.replaceAll("23","#");
    // str = str.replaceAll("24","$");
    str = str.replaceAll("25","%");
    ....
    Nooooooooo. Che roba è??!!

    Se ogni 2 caratteri hex esatti ha il valore per rappresentare 1 carattere ASCII fai molto più semplicemente così: vai avanti con un indice di 2 in 2. Prendi 2 caratteri per volta con substring() e lo passi a Integer.parseInt() (con radix 16), quindi fai un cast a char che "butti" in uno StringBuffer.
    Se lo fai bene, ci vogliono poche righe e pulite.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Si, effettivamente come dici tu è meglio. Comunque non mi serve scorrere di un indice 2 per 2, perché i valori esadecimali ce li ho in un array.

    Comunque il lavoro consiste nello scrivere un file, convertendo i caratteri esadecimali in ascii.
    Se hai qualche dritta è ben accetta.
    Non ci sono Queen senza Freddie !

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da music_ale
    Si, effettivamente come dici tu è meglio. Comunque non mi serve scorrere di un indice 2 per 2, perché i valori esadecimali ce li ho in un array.

    Comunque il lavoro consiste nello scrivere un file, convertendo i caratteri esadecimali in ascii.
    Se hai qualche dritta è ben accetta.
    Spiega meglio .... prima sembrava che avevi tutto in un String ... non in un array.

    Senti, fai un esempio, che è meglio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Ho la seguente situazione:

    arrayHEX = {"34", "3f", "5a".....}

    Io devo scrivere questi valori in un file, quindi forse ciò che mi hai detto prima può funzionare.
    In particolare il file è un pdf, quindi alla fine io dovrei avere il file pdf ricostruito.

    Dalle prove che sto facendo adesso, alla fine dell'esecuzione del programma mi dice "il file è danneggiato e non può essere recuperato".
    Non ci sono Queen senza Freddie !

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da music_ale
    arrayHEX = {"34", "3f", "5a".....}
    Ok

    Originariamente inviato da music_ale
    In particolare il file è un pdf, quindi alla fine io dovrei avere il file pdf ricostruito.
    Ecco un dettaglio molto importante in più. Alla fine non devi avere "caratteri" ma byte.

    Quindi: ogni elemento è una stringa hex 00...FF, la passi a Integer.parseInt (con radix 16, nota!) e ottieni un int 0...255. A seconda di cosa poi usi puoi lasciarlo int o fare il cast a byte.

    Quello che è fondamentale è che devi usare gli XXXOutputStream (su file è quindi FileOutputStream).

    E lo ripeto: non devi trattare "caratteri", non devi usare char, non devi usare PrintStream/PrintWriter/XXXWriter.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    public void printToFile(String[] data)
    {
    for (int i=0; i<data.length; i++)
    {
    int value = Integer.parseInt(data[i], 16);

    try {
    file.write((byte)value);
    file.flush();

    } catch (IOException ioe) { }
    }
    }


    Io ho fatto così, ma ottengo un errore NullPointerException subito dopo il primo carattere dell'array di stringhe
    Non ci sono Queen senza Freddie !

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Mi spiace, ma senza vedere il resto è difficile capire cosa non va. Non si vede dove hai dichiarato 'file' e di che tipo è (FileOutputStream?).
    Mettere un try/catch in quel punto (con catch "vuoto", oltretutto) e addirittura un flush dopo ogni singolo byte .... non è appropriato.
    E quel cast a byte nella write non serve. Come dicevo appunto prima, potevi lasciare int o fare il cast ... ma dipende dove lo devi mettere/passare. E quella write(int) accetta un int di cui "sa" che deve prendere solo gli 8 bit bassi. Ecco perché il cast non serve!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.