readLine - błąd w Javie????

Oglądasz archiwalną wersję wątku "readLine - błąd w Javie????" z forum pl.comp.lang.java



Kordian - 27 Maj 2004, 07:41
Witam,

Czy może ktoś dojrzy błąd, którego ja nie widzę. Otóż poniższy przykład czyta
co drugą linię (i to tylko parzystą). Dlaczego?

____________________________________________________________________
import java.io.*;

class read_file {

        public void readFile () {
                try {
                        BufferedReader l = new BufferedReader(new FileReader
("sd4servers.txt"));
                        //DataInputStream  s = new DataInputStream(l);
                        String line;

                        int count = 0;
                        while ((line = l.readLine()) != null) {
                            // process the line
                            System.out.println("Did line number: " +
l.readLine() + " " + count++);
                        }

                        l.close();
                }
                catch (IOException e) {System.out.println(e.getMessage());}
    }

        public static void main(String[] args) {
                read_file rf = new read_file();
                rf.readFile();
        }

}



______________________________________________________________

Nie wiem zupełnie o co chodzi :(

Pozdr
Kordian




Jarus - 27 Maj 2004, 08:01
Witam

a metoda readline(), ktora wolasz u siebie 2 razy czasem nie przesuwa
wskaznika w pliku na nastepna linie po jej wywolaniu?

Jarek

Witam,

Czy może ktoś dojrzy błąd, którego ja nie widzę. Otóż poniższy przykład
czyta
co drugą linię (i to tylko parzystą). Dlaczego?

____________________________________________________________________
import java.io.*;

class read_file {

public void readFile () {
try {
BufferedReader l = new BufferedReader(new FileReader
("sd4servers.txt"));
//DataInputStream  s = new DataInputStream(l);
String line;

int count = 0;
while ((line = l.readLine()) != null) {
    // process the line
    System.out.println("Did line number: " +
l.readLine() + " " + count++);
}

l.close();
}
catch (IOException e) {System.out.println(e.getMessage());}
    }

public static void main(String[] args) {
read_file rf = new read_file();
rf.readFile();
}
}
______________________________________________________________

Nie wiem zupełnie o co chodzi :(

Pozdr
Kordian

--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl





Kuba - 27 Maj 2004, 08:21
Tu czytasz "kolejna linie":

  System.out.println("Did line number: " +
l.readLine() + " " + count++);

wystarczy

System.out.println("Did line number: " +
line + " " + count++);

pzdr,
kuba



Gambit - 27 Maj 2004, 08:12

while ((line = l.readLine()) != null) {
    // process the line
    System.out.println("Did line number: " +
l.readLine() + " " + count++);



W System.out.println() jak sądzę chciałeś użyć "line" zamiast
"l.readLine()".

Pozdrawiam!
Gambit




Kordian - 27 Maj 2004, 08:20
Dziękuję! Kurcze ale błąd... <zawstydzony:))


Jarek Ratajski - 27 Maj 2004, 09:03

Dziękuję! Kurcze ale błąd... <zawstydzony:))



To jeszcze oducz się na początek tak pisać:
((line = l.readLine()) != null)
^^^^^^^^^^^^^^^^^^^^^^

i będziesz miał mniej takich problemów.
(Hint 1: to ze się mieści w jednej linijce
nie znaczy, ze działa szybciej od wersji nieco dłuższej). (Chociaż dawno temu
jak pisałem w C++ to w takie rzeczy wierzyłem).
(Hint 2: jak nie da się dopasować do pętli while - to lepiej użyj
pętli for ( ;; )  - będziesz miał i zwięźle, i przejrzyście).



Piotr Maj - 27 Maj 2004, 09:49

To jeszcze oducz się na początek tak pisać:
((line = l.readLine()) != null)
^^^^^^^^^^^^^^^^^^^^^^

i będziesz miał mniej takich problemów.



Możesz rozwinąć temat. Co takiego złego jest w tej linijce?



Jarek Ratajski - 27 Maj 2004, 11:26


| To jeszcze oducz się na początek tak pisać:
| ((line = l.readLine()) != null)
| ^^^^^^^^^^^^^^^^^^^^^^

| i będziesz miał mniej takich problemów.

Możesz rozwinąć temat. Co takiego złego jest w tej linijce?



Formalnie jest dobra.
Jak widac jednak na załączonym obrazku - są ludzie, którym to zaciemnia.
Uważam za bardziej czytelną konstrukcję typu:
for (String line = l.readLine(); line!=null; line = l.readLine() ) {...}

Cała konstrukcja IMO wywodzi się z C, gdzie w zasadzie wystarczy
samo "while ( line = l.readline() )". Tyle, że to jest naprawdę paskudny styl -
a z tego co pamietam wiekszosc kompilatorow wygeneruje ostrzezenie, ( a
wiekszośc mamutów stwierdzi, że nie ma nic złego w takiej konstrukcji ).

Nie ma się co tu rozpisywac i robić flejma - to są gusta w dużym stopniu.
Powiem tylko, ze się jak pracuje w zespole np. 9-cio osobowym i codzienie
napływają tony nowego kodu, ktory trzeba użyć, a czasem zdebugowac. To nawet
głupia konstrukcja z ( ?  :  ) potrafi zdenerwować (tzn. jednak jakoś 6-cio
linijkowy if {} else {} jest strawniejszy dla wzroku - zwykle). To nie są jakieś
moje prywatne przemyślenia -jest troche programów do metryk i analizy kodu,
które dokładnie takie rzeczy wyłapują i traktują jako "zły styl".
A IMHO przejrzystego pisania kodu nigdy za wiele - nawet jak tylko na prywatny
użytek.



Krzysztof Rudnik - 27 Maj 2004, 11:47


| To jeszcze oducz się na początek tak pisać:
| ((line = l.readLine()) != null)
| ^^^^^^^^^^^^^^^^^^^^^^

| i będziesz miał mniej takich problemów.

| Możesz rozwinąć temat. Co takiego złego jest w tej linijce?

Formalnie jest dobra.
Jak widac jednak na załączonym obrazku - są ludzie, którym to zaciemnia.
Uważam za bardziej czytelną konstrukcję typu:
for (String line = l.readLine(); line!=null; line = l.readLine() ) {...}



Jest dluzsza - 2 razy wystepuje takie samo podstawienie - lepiej
tego unikac, bo mozna przypadkiem jedno poprawic a drugie nie.

Cała konstrukcja IMO wywodzi się z C, gdzie w zasadzie wystarczy
samo "while ( line = l.readline() )". Tyle, że to jest naprawdę paskudny
styl - a z tego co pamietam wiekszosc kompilatorow wygeneruje ostrzezenie,
( a wiekszośc mamutów stwierdzi, że nie ma nic złego w takiej konstrukcji
).



Ja bardzo lubie C wlasnie za to ze nie musze powtarzac czesci petli
drugi raz poza petla.

A ostrzezenie gcc da zeby dac jeszcze jedne nawiasy bo jest podstawienie
w miejscu gdzie spodziewa sie warunku i moze byc blad =/==.

Krzysiek Rudnik



jarekr - 27 Maj 2004, 12:55

| Jak widac jednak na załączonym obrazku - są ludzie, którym to zaciemnia.
| Uważam za bardziej czytelną konstrukcję typu:
| for (String line = l.readLine(); line!=null; line = l.readLine() ) {...}

Jest dluzsza - 2 razy wystepuje takie samo podstawienie - lepiej
tego unikac, bo mozna przypadkiem jedno poprawic a drugie nie.



OK. Kłocić sie nie będe bo to gusta troche.
Odsyłam do google i hasła:
"coding style guides java" dużo jest opisane na te tematy - są ludzie, którzy uznali, że
czasem lepiej jest dodać jedną/dwie linijki, aby poprawić czytelnośc - i warto nawet o tym popisać w
guidach. Jak sądzę mieli jakies powody (oparzenia III-go stopnia?), żeby się tak męczyć (w sensie
pisać).
Przykład z jednej ze stron tak wyszukanych:
http://geosoft.no/javastyle.html:
53. Executable statements in conditionals must be avoided.
file = openFile (fileName, "w");  // NOT:   if ((file = openFile (fileName, "w")) != null) {
if (file != null) {               //         :
  :                               //        }
}
Conditionals with executable statements are simply very difficult to read. This is especially true for programmers new to Java.



--
jarekr



Piotr Maj - 27 Maj 2004, 12:20

Formalnie jest dobra.
Jak widac jednak na załączonym obrazku - są ludzie, którym to zaciemnia.
Uważam za bardziej czytelną konstrukcję typu:
for (String line = l.readLine(); line!=null; line = l.readLine() ) {...}



Masz rację... nie ma co robić kolejnego flame war'a. Powiem tylko,
że konstrukcję z while spotkasz wszędzie (w każdym tutorialu
i w większości kodu operującego na strumieniach), natomiast powyższego
dziwoląga chyba tylko w Waszym zespole (ja co prawda mało w życiu
widziałem, ale powyższe widzę pierwszy raz). Nie mówię, że tak nie
można, albo, że to jest jakaś siara - po prostu powyższy kod jest dość
... nietypowy i IMHO wcale nie bardziej czytelny.

A błąd kolegi, który ponownie wywołał readLine() wcale nie zostałby
wyeliminowany przy zastosowaniu Twojego rozwiązania, bo to był błąd
innej natury, wynikający raczej z braku doświadczenia w tego typu
konstrukcjach jako takich.

Proponuję EOT.



Piotr Lipski - 28 Maj 2004, 03:35

for (String line = l.readLine(); line!=null; line = l.readLine() ) {...}



Zaletą tej konstrukcji jest deklaracja zmiennej line jako lokalnej, używanej
wewnątrz pętli. Nie jest zaśmiecana przestrzeń nazw, nie ma niebezpieczeństwa
nieświadomego ponownego użycia line poza pętla bez odpowiedniej inicjacji.

PL


odpowiednik 'sound(Hz); nosound()' w javie?
pobieranie danych z bazy w mysql i wysylanie danych do plikow w javie swing
Co piszecie w Javie. Jakie problemy rozwiązujecia za pomoca tego języka ??
Czy możliwe jest skompilowanie programu napisanego w Javie do postaci *.exe ?
  • dentystke blog i klawiature tez blog
  • rollo armstrong
  • pism w sprawach podatkowych
  • dorotka rabczewska fotki
  • woman judo
  • brian m
  • lotnisko w katowicach pyzowice
  • montaz nastawnika
  • iveco daily ksiazka download
  • Zbieranina wiadomości z for dyskusyjnych || Indeks