Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Carattere inesistente

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    3

    Carattere inesistente

    Sto cercando di estrapolare una parte di informazione da un codice html. Il problema è che utilizzando il metodo charAt, continua a darmi un sempre lo stesso errore

    Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 56

    il codice è il seguente
    try {
    URL url = new URL("http://www.atm-mi.it/Appl_ATM/Orari/superficie1.aspx?linea=92&verso=a&cb1=1&cb2=0&lang =ita");
    BufferedReader pagina = new BufferedReader(new InputStreamReader(url.openStream()));
    while(true){
    String download =pagina.readLine();
    String nuova;
    if (download==null)
    break;
    else
    nuova=download;

    int r=0;
    while ((r= nuova.indexOf("COLOR: white", r)) != -1){
    char c = nuova.charAt(r);
    while (c !='>'){
    r++;
    c=nuova.charAt(r);
    }

    while(c!='<'){
    r++;
    //int charVal=c;
    //System.out.println(charVal);
    c=nuova.charAt(r);
    int charVal=c;
    System.out.print(c);
    }

    r++;
    }
    }
    }catch (IOException e) { System.out.println(e); }

    ho provato anche ad effettuare un ciclo che mi possa permettere di togliere i caratteri non stampabili o cmq che non dovrebbero esser presi con il chatAt, eppure mi continua a dare sempre lo stesso errore. Il ciclo che ho utilizzato per fare ciò è il seguente

    while (c < (char) 33 && c > (char) 127){
    r++;
    c=nuova.charAt(r);
    }

    a questo punto non so più cosa fare è_é se avete suggerimenti o soluzioni ve ne sarei grato perchè non riesco proprio a capire come diamine si possa estrapolare l'informazione. L'informazione da prendere nella pagina è la seguente

    92BOVISA FN - VIALE ISONZO

    grassie a tutti anticipatamente

  2. #2
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    Volevo ringraziarti per aver letto attentament il regolamento... magari la prossima volta usa i tag [ code ][/ code ] o [ php][ /php] e indenta il codice..

    Codice PHP:
    try
    {
        
    URL url = new URL("http://www.atm-mi.it/Appl_ATM/Orari/superficie1.aspx?linea=92&verso=a&cb1=1&cb2=0&lang=ita");
        
    BufferedReader pagina = new BufferedReader(new InputStreamReader(url.openStream()));
        while(
    true)
        {
            
    String download pagina.readLine();
            
    String nuova;
            if (
    download==null)
                break;
            else
                
    nuova=download;
            
    /*
            Perche' sta roba?
            Arrivati qui sara' sempre nuova = download, tanto vale scrivere:
            
            String line = pagina.readLine();
            if (line==null)
                break;
            
            */

            
    int r=0;
            while ((
    rnuova.indexOf("COLOR: white"r)) != -1)
            {
                
    char c nuova.charAt(r);
                while (
    !='>')
                {
                    
    /*
                        E se il '>' fosse nella riga successiva? 
                        Avresti un bel indexOutOfBoundException
                    */
                    
    r++;
                    
    c=nuova.charAt(r);
                }

                while(
    c!='<')
                {
                    
    /*
                        Come sopra
                    */
                    
    r++;
                    
    //int charVal=c;
                    //System.out.println(charVal);
                    
    c=nuova.charAt(r);
                    
    int charVal=c;
                    
    System.out.print(c);
                }

                
    r++;
            }
        }
    }
    catch (
    IOException e)
    {
        
    System.out.println(e);
        
    /*
            Rieccoci.. o ammazzano l'eccezione o gli tolgono tutto il significato.
            Ma fate a meno di gestirle, piuttosto!
            O eliminii il blocco try-catch o scrivi
            
            e.printStackTrace();

            Che dice molto di più sull'errore.
            Ad esempio potresti scoprire in quale riga si verifica... 
        */

    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    3
    volevo scusarmi per non aver letto attentamente il regolamento, mea culpa ma preso dalla disperazione visto che stavo cercando di risolvere questo dannato problema, l'ho letto molto velocemente. Avendo imparato java praticamente da nemmeno un mese non conosco tutte le sfaccettature del linguaggio ovviamente e cerco di fare del mio meglio.

    Ho provato ad apportare al programma la modifica che hai detto e l'errore rimane il seguente

    Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 56
    at java.lang.String.charAt(String.java:558)
    at ProgettoDiReti.SocketTest.main(SocketTest.java:91)
    Java Result: 1

    che corrisponde a questa parte di codice

    codice:
                while(c!='<')
                {
                    /*
                        Come sopra
                    */
                    r++;
                    c=nuova.charAt(r);
                    int charVal=c;
                    System.out.print(c);
                }
    precisamente alla riga nella quale vi è la variabile c=... In ambedue i casi comunque mi dava lo stesso identico errore che ho presentato al principio purtroppo. A questo punto sono da capo, non riesco a capire per quale motivo mi debba continuare ad dire che non riesce a prendere quel benedetto carattere

    però mi sorge un dubbio. Come hai espressamente detto, se si trova nella riga successiva mi darebbe lo stesso problema. In effetti dovrebbe essere così, ovvero esiste uno spazio o cmq un a capo, non è ben chiaro cosa ci sia e continua a darmi il medesimo errore. è possibile quindi dirgli di andare a capo e prendere eventualmente la parte di codice che mi potrebbe interessare? cioè intendo dire, è possibile evitare l'eccezzione che tu stesso dici? anche perchè per poter eventualmente togliere quel problema avevo provato ad utilizzare il trim() o il replaceAll() sostituendo gli a capo con degli spazi o con qualcosa di diffierente, ma la risposta è sempre la stessa sigh sob....

    grassie ancora in anticipo e scusami ancora

  4. #4
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    anche perchè per poter eventualmente togliere quel problema avevo provato ad utilizzare il trim() o il replaceAll() sostituendo gli a capo con degli spazi o con qualcosa di diffierente
    Proprio non capisco... tu leggi il codice di una pagina html, una riga alla vlolta.
    All'interno di questo ciclo di for:
    Codice PHP:
        while(true)
        {
            
    String download pagina.readLine();
            ... 
    Ad ogni iterazione che fai, leggi una nuova riga del codice HTML. Quindi non è che puoi rimuovere gli "a capo" lavorando su una singola riga... anche se usi un repalceAll sulla riga, di "a capo" uno solo ce n'e', alla fine della riga!
    Se il codice HTML e' scritto in questo modo:

    <div style="color: white">Mario Freschi
    </div>

    Il tuo algoritmo va in crisi. Anche se non è detto che non vi siano problemi di altro tipo...
    Il primo passo potrebbe essere quello di stampare tutta la riga letta come prima istruzione nel ciclo di while di cui sopra. In questo modo si può capire su che stringa lavora il tuo algortmo. (penso che prima o poi mi metterò a cercare un manuale sull'arte dimenticata di fare debug...)

    Magari, invece di leggere le righe da url, leggi da un file con righe scritte da te, in modo che sia possibile testare il codice in tutte le condizioni che ritieni possibili. La prima prova la farai con righe di codice HTML perfette. Quando in questa modalità funzionerà correttamete, comincerai ad aggiungere i difetti che caratterizzano le pagine web reali.

    Qui hai due possibilità:
    1. o complichi notevolmente il codice in modo da tener memoria che alla riga precedente hai trovato un ">" oppure un "<", oppure... in modo che alla riga successiva l'algoritmo sappia in che stato si trova (ne sai qualcosa delle macchine a stati?)

    2. in modo molto più semplice e osceno (se il file che leggi è troppo lungo va tutto a farsi benedire, ma attualmente le stringhe in java possono essere molto lunghe... anche se forse l'uso di uno StringBuffer sarebbe preferibile), fai un ciclo di while che esaurisce tutto lo stream proveniente dall'url e che produce un'unica stringa contenente tutto il codice html della pagina, a partire dalla prima all'ultima riga html, spazi e "a capo" compresi, che tanto non danno fastidio.
    In seconda battuta fai girare il tuo algoritmo su quest'unica mega stringa.

    Ciao!
    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

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.