Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Eccezione IndexOf

  1. #1

    Eccezione IndexOf

    ciao a tutti,
    sto avendo in esecuzione del mio programma un eccezione che non capisco.
    Il codice (riassunto) è questo:
    codice:
       while(!linea.equals("")){
    29:   	linea2 = linea.substring(linea.indexOf("<")+1,linea.indexOf(">"));
    	[...]
    	linea = linea.substring(linea.indexOf(">")+1);
       }
    l'eccezione è:
    codice:
    Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    	at java.lang.String.substring(Unknown Source)
    	at prova3.main(prova3.java:29)
    linea al momento in cui mi appare l'eccezione contiene "jhvjv</h1> "

    non capisco proprio... qualcuno può darmi una mano?

    grazie
    Flash Developer for Rich Media
    PHP, jQuery Developer

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

    Re: Eccezione IndexOf

    Originariamente inviato da Miroku
    l'eccezione è:
    [CODE]Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    Nota che ti dice che c'è un indice -1. Il -1 viene restituito da indexOf quando non trova la parte cercata.

    substring() ha delle regole molto ferree:
    IndexOutOfBoundsException - if the beginIndex is negative, or endIndex is larger than the length of this String object, or beginIndex is larger than endIndex.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    ok e questo lo sapevo.
    Il fatto che non mi spiego è:
    proprio ora con un if ho guardato quale dei due caratteri restituiva -1 ... e il carattere è il < .............
    come può essere che nella stringa "jhvjv</h1> " non ci sia il carattere <?!
    Flash Developer for Rich Media
    PHP, jQuery Developer

  4. #4
    Posto il codice un po' più completo:

    codice:
    Vector<String> linee = new Vector<String>();
    		linee.add("<!DOCTYPE bla bla><?php echo ciao; ?> <h1>jhvjv</h1> ");
    		linee.add("<div id=\"maincontainer\" style=\"ciao\">questo è");
    		linee.add(" <%=ciao%> il main <img src=\"ciao.jpg\" /> container</div>");
    		linee.add("<a href=\"ciao.htm\">questo e' un link</a>");
    		String linea2, nome_tag;
    					   
    		for(String linea:linee){
    			
    			while(!linea.equals("")){
    				char c = linea.charAt(linea.indexOf("<")+1);
    				if (c == '?') linea = linea.substring(linea.indexOf("?>")+2);// se ci sono tag PHP li elimina - +2 perké indexOf calcola l'indice del primo carattere della stringa nell'arg
    				else if (c == '%') linea = linea.substring(linea.indexOf("%>")+2);// se ci sono tag ASP li elimina
    				else if (c == '!') linea = linea.substring(linea.indexOf(">")+1);// se ci sono tag di commento li elimina
    				else {
    						 System.out.println(linea+"\n"+linea.indexOf("<")+1+"\n");
    						if(linea.indexOf("<")+1 == -1) System.out.println("<");
    						else if(linea.indexOf(">") == -1) System.out.println(">"); 
    						linea2 = linea.substring(linea.indexOf("<")+1,linea.indexOf(">"));
    						try{
    							Tag t = new Tag(linea2);
    							 //prima di inserirlo nello stack controllare se è di apertura o chiusura così da vedere se metterlo o toglierlo
    							if(t.getOpen() != 2){
    								tags.add(t); // simula il tagStack
    							}
    						}catch(MalformedTagException e){
    							System.out.println(e);
    						}
    						linea = linea.substring(linea.indexOf(">")+1); // elimino il testo già esaminato perché indexOf restituisce solo il primo carattere che trova, non tutti.
    					
    				}
    			}
    		}
    Le parti in arancione sono dei debug manuali, che restituiscono:

    codice:
     <h1>jhvjv</h1> 
    11
    
    jhvjv</h1> 
    51
    
     
    -11
    Proprio non capisco... perké nella prima riga... lui va a prendersi il secondo < e non il primo?!
    Flash Developer for Rich Media
    PHP, jQuery Developer

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ma perché ti complichi la vita?? Se hai una pagina html da elaborare puoi metterla dentro una unica String ed usare comodamente le espressioni regolari per eliminare e/o estrarre ciò che ti serve.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    beh, per ora stavo provando questa maniera.
    Potresti aiutarmi con questo?
    Quell'errore me lo dà da quando ho messo la stringa di prova html in un vettore e ho usato il foreach.
    Flash Developer for Rich Media
    PHP, jQuery Developer

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Osserva questo:
    codice:
    import java.util.regex.*;
    
    public class Prova4
    {
        public static void main (String[] args)
        {
            String html = "<html>\r\n" +
                          "<body>\r\n" +
                          "<h1 class='prova'>Hello</h1>\r\n" +
                          "\r\n" +
                          "</body>\r\n" +
                          "</html>";
        
            Pattern pattern = Pattern.compile ("<(/?)([a-zA-Z0-9-_.:]+)(.*?)>");
            Matcher matcher = pattern.matcher (html);
    
            while (matcher.find ())
            {
                System.out.println ("trovato: \"" +
                                    matcher.group (1) + "\"   \"" +
                                    matcher.group (2) + "\"   \"" +
                                    matcher.group (3) + "\"");
            }
        }
    }
    Output:
    codice:
    trovato: ""   "html"   ""
    trovato: ""   "body"   ""
    trovato: ""   "h1"   " class='prova'"
    trovato: "/"   "h1"   ""
    trovato: "/"   "body"   ""
    trovato: "/"   "html"   ""
    Semplice, no?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    si è semplice........
    però uffa, cercavo di trovare una soluzione al problema di prima.... e in più non mi serve per come devo sviluppare il progetto

    cmq credo che il fatto di mettere tutto il documento in una stringa sola lo farò, almeno ovvio a uno dei problemi che avrei dovuto analizzare.
    Flash Developer for Rich Media
    PHP, jQuery Developer

  9. #9
    Originariamente inviato da Miroku

    Proprio non capisco... perké nella prima riga... lui va a prendersi il secondo < e non il primo?!
    Ma guarda che l'output è corretto. Sei tu che sbagli ad interpretare il numero dell'indice che ti esce perchè sbagli a fare il System.out.println

    Tu hai scritto:
    codice:
    System.out.println(linea+"\n"+linea.indexOf("<")+1 +"\n");
    la parte in grassetto non esegue la somma, ma concatena le stringhe dato che prima c'è una somma di stringhe.

    Infatti ti esce scritto 11 dove il primo 1 è l'indexOf e l'altro 1 è l'1 che tu aggiungi manualmente. Poi sei stato sfortunato che il carattere 11 coincida proprio col secondo <

    Andrebbe corretta così se vuoi vedere gli indici come si deve:

    codice:
    System.out.println(linea+"\n"+(linea.indexOf("<")+1)+"\n");
    Al mio segnale... scatenate l'inferno!

  10. #10
    cavolo hai ragione! >_<

    Cmq sia rimane il fatto che qll errore non lo capisco.... va beh cmq ho "risolto" scegliendo un'altra strada, grazie =P
    Flash Developer for Rich Media
    PHP, jQuery Developer

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 © 2025 vBulletin Solutions, Inc. All rights reserved.