Toon posts:

[java] readLine slaat regel over

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb de volgende code (alleen het relevante gedeelte):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
String Url=new String;

do
                 {
                counter++;
                String url=reader.readLine();
                    Url=reader.readLine();

                    StringTokenizer tokenizer = new StringTokenizer(url, " ");
                    StringBuffer result = new StringBuffer();

                     while(tokenizer.hasMoreTokens())
                     {
                     result.append(tokenizer.nextToken());

                        if(tokenizer.hasMoreTokens())
                        {
                         result.append(' ');
                        }
                     }


                  //url=url.substring(i);
                  out.println("<a href="+a+voor+result.toString()+a+">"+naam+counter+"</a>");
                 }while(Url!=null);


Het probleem is ik voor het controleren van de while() een reader.readLine() moet aanroepen en daardoor slaat hij in de main van de while() telkens een regel over.
Als ik de voorwaarde Url!=null verander in url!=null geeft hij een compile-error omdat url afhankelijk is van reader.readLine() en deze bestaat nog niet of wel ??

Het is vast een detail, maar ik zie het echt niet.

  • Rigi
  • Registratie: September 2001
  • Laatst online: 30-11-2018
Ik neem aan dat die reader gemaakt is op Url?
als je nou is
code:
1
url = reader.readline()
weglaat.
(en de stringtokenizer op Url zet)

  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
code:
1
2
String url=reader.readLine();
 Url=reader.readLine();


Je leest idd tweemaal je reader uit ...

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.


Verwijderd

Heb je zelf nog een beetje in je hoofd zitten wat het verschil zou zijn tussen een String die url heet en een string die Url heet? Gebruik meer beschrijvende namen als dat nodig is, en dat is in dit geval zéker nodig.

Volgens mij moet je de eerste regel vervangen door:
Java:
1
String url;

Vervolgens drop je de regel Url=reader.readLine();, en maak je van de regel ervoor url = reader.readLine();
Tenslotte moet je de Url in de while voorwaarde vervangen door url

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Tip van de dag:
Class namen beginnen met een hoofdletter. Variabelen en object instancies beginnen altijd met een kleine letter.

"Beauty is the ultimate defence against complexity." David Gelernter


Verwijderd

Topicstarter
Ik moet een nieuwe String aanmaken in de do-while omdat het anders niet wordt herkend in de while() en als ik de String url/Url=reader.readLine() niet toepas geeft de tokenizer een nullpointerexception.
Dus als ik binnen de do-while de String aanmaak geeft de while() voorwaarde aan "cannot resolve symbol" en als ik buiten de do-while de String aanmake geeft de tokenizer een nullpointerexception.
De getoonde versie werkt, alleen slaat het dus noodgedwongen een regel over, is mark() en reset() misschien een mogelijkheid voor een do-while ?


hebbus :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 do
                    {


                    if(counter>0)
                    {
                        reader.reset();    // er valt bij 0 nog niet zo veel te resetten ;)
                    }
                    
                    counter++;

                    String Url=reader.readLine(); // lijkt noodzakelijk voor de tokenizer

                    StringTokenizer tokenizer = new StringTokenizer(Url," ");
                    StringBuffer result = new StringBuffer();

                     while(tokenizer.hasMoreTokens())
                     {
                     result.append(tokenizer.nextToken());

                        if(tokenizer.hasMoreTokens())
                        {
                         result.append(' ');
                        }
                     }
                   reader.mark(0);                  // vlaggetje vanaf regel 0
                   url=reader.readLine();       // aiiii..noodzakelijk voor de while, regeltje  
                                                                 verder
                   out.println("<a href="+a+voor+result.toString()
                                           +a+">"+naam+counter+"</a>");
                   }  while(url!=null);             // ff checken


Bedankt :) .

[ Voor 58% gewijzigd door Verwijderd op 22-02-2004 18:11 ]


Verwijderd

Doe eens exact wat ik zei.

[edit]
Nu heb je zelf toch iets anders gedaan, en heb je een bagger-oplossing. Ik kan het niet anders zeggen.

Waarom heb je twee variabelen nodig om iedere keer één regeltje uit te lezen en daar iets mee te doen? Door de tweede variabele die jij erbij stopt wordt je script ongeveer twintig keer foutgevoeliger. Je slaat de raad van Macros volledig in de wind. Waarom vraag je hier eigenlijk iets als je uiteindelijk toch zelf maar een shitty oplossing bedenkt?

[ Voor 92% gewijzigd door Verwijderd op 22-02-2004 18:18 ]


Verwijderd

Topicstarter
Dan geeft de tokinezer een om de een of andere vage reden een nullpointerexception. De raad van macros is niet onopgemerkt gebleven en ik heb uitgelegd waarom ik 2 variabelen nodig schijn te hebben.
Waarom vraag je hier eigenlijk iets als je uiteindelijk toch zelf maar een shitty oplossing bedenkt?
Dit is voor nu een oplossing, ik zal proberen uit te pluizen waarom de tokenizer een nullpointer geeft.

[ Voor 78% gewijzigd door Verwijderd op 22-02-2004 18:25 ]


Verwijderd

Dat is waar ook, maar dat komt omdat je weet dat het resultaat van reader.readLine() null kan zijn. En daar kan de StringTokenizer niks mee. En dat betekent dus dat je het stuk waar je iets met de eventuele regel zou willen gaan doen in een if-block moet staan:
Java:
1
2
3
if (url != null) {
   StringTokenizer ...etc
}

Of wat je ook kunt doen is een regel toevoegen na de readLine regel:
Java:
1
if (url == null) break;

Maar dan vind ik de eerste versie netter.

[ Voor 5% gewijzigd door Verwijderd op 22-02-2004 18:26 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 21:44

Robtimus

me Robtimus no like you

Eventjes een vrij normale manier om zo over de lines te loopen:
Java:
1
2
3
4
5
String url;
while ((url = reader.readLine()) != null)
{
    //  .....
}
Dit is equivalent aan
Java:
1
2
3
4
5
6
String url = reader.readLine();
while (url != null)
{
     // ....
    url = reader.readLine();
}
Als je het zo doet kan het nooit foutgaan als je verder niet reader.readLine() aanroept.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
Inderdaad Cheatah:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
url=reader.readLine();

                    if(url !=null)
                    {
                    StringTokenizer tokenizer = new StringTokenizer(url," ");
                    StringBuffer result = new StringBuffer();

                     while(tokenizer.hasMoreTokens())
                     {
                     result.append(tokenizer.nextToken());

                        if(tokenizer.hasMoreTokens())
                        {
                         result.append(' ');
                        }
                      }
                     out.println("blablabla"); 
                    }


deze werkt

[ Voor 8% gewijzigd door Verwijderd op 22-02-2004 20:10 ]


Verwijderd

Topicstarter
Iceman, met jouw tweede optie slaat hij toch meteen een regel over ?
Het eerste is inderdaad wat netter.

[ Voor 22% gewijzigd door Verwijderd op 22-02-2004 20:17 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 21:44

Robtimus

me Robtimus no like you

Verwijderd schreef op 22 februari 2004 @ 20:15:
Iceman, met jouw tweede optie slaat hij toch meteen een regel over ?
Het eerste is inderdaad wat netter.
Nee, want de readLine doe je pas op het einde. Dus de tweede regel wordt pas ingelezen nadat de eerste volledig is verwerkt.

More than meets the eye
There is no I in TEAM... but there is ME
system specs

Pagina: 1