Czemu fragment procedury nie wykonuje się - początkujący

0

Witam wszystkich, w Java piszę niewiele, uczę się tego. Poniżej procedura z małej aplikacji, która ma za zadnie konwertować plik tekstowy.
Nie rozumiem czemu nie wykonuje się instrukcja "label_status.setText("Plik zapisany");", sam program działa zgodnie z oczekiwaniami,
tzn. generuje plik wynikowy w oczekiwanej postaci.
Przepraszam, że napisałem to w treści ale nie działa mi formatowanie tekstu, też nie wiem czemu :) zamiast bold wstawiają się gwiazdki.
Debian 9, Java 1.8 .. 13, Netbeans 12.0
Jarek.

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    String plik, lnbuf, nrdok = "x", nip = "x", datafv = "x", nazwaodb = "x";
    String elem[] = null;
    StringBuilder xx = null; String Nazwa;

    jFileChooser1.addChoosableFileFilter(new FileNameExtensionFilter("Pliki zamówieñ","kt0"));
    jFileChooser1.setAcceptAllFileFilterUsed(false);
    jFileChooser1.setCurrentDirectory(new File("/home/jarek/VM_SHARE/sources/java/PCMHelper/dane"));

    if (jFileChooser1.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {

        plik = jFileChooser1.getSelectedFile().toString();
        label_plik.setText(plik);

        try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(plik)));
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(plik + ".txt")))) {

            while ((lnbuf = br.readLine()) != null && !lnbuf.contains("-KSBLOZ-")) {
                if (lnbuf.contains("Numer faktury")) {
                    nrdok = lnbuf.substring(16, lnbuf.length());
                }
                if (lnbuf.contains("Data faktury")) {
                    datafv = lnbuf.substring(15, lnbuf.length());
                }
            }

            // nie udalo sie znalezc poczatku pozycji, przerywam wykonanie proceduty
            if (lnbuf != null && !lnbuf.contains("-KSBLOZ-")) {
                return;
            }
            
            AddPCMHeader(bw, nrdok, nip, datafv, nazwaodb);
            // czytamy pozycje dokumentu
            while (lnbuf != null) {
                
                // zostaw tylko jedną spację miedzy słowami
                lnbuf = br.readLine();
                if (lnbuf.length() > 110) {
                    xx = new StringBuilder(lnbuf.substring(110).trim());
                    int yy = xx.indexOf("  ");
                    while (yy > 0) {
                        xx.delete(yy, yy + 1);
                        yy = xx.indexOf("  ");
                    }
                }
                // rozdziel elementy rozdzielona spacja
                elem = xx.toString().split("\\s");

                // jeżeli tablica ma mniej niż 11 elementów, to 
                if (elem == null || elem.length < 11) {
                    return;
                }
                AddPCMPoz(               bw,        elem[1],           elem[2],   elem[5],     "szt",      elem[6],     elem[5]);                     
            }

        label_status.setText("Plik zapisany");

        } catch (FileNotFoundException ex) {
            label_status.setText("Nie moṡna wczytaæ pliku");
        } catch (IOException ex) {
            label_status.setText("problem zapis/odczyt");
        }
    }
}
2

Nikt Cie nie zastąpi w użyciu debugera.
Masz Netbeansa, wiec to jest wygodne

Aha,

  • używamy słownictwa KOD METODY (tak się nazywa w programowaniu obiektowym) lub "zdarzenia" ze względu na GUI Swinga, ale nie "procedury", w Javie ich nie ma.
  • cokolwiek to długie jest i źle się czyta, Warto wydzielić do jakiś prywatnych metod pomocniczych, przy czym ich najcenniejszą rzeczą będzie NAZWA.
    Nazywanie czegoś ma dużą wartość. Obecnie czytelnik nie bardzo wie, jaki zamiar co do kodu miał autor.
0
AnyKtokolwiek napisał(a):

Nikt Cie nie zastąpi w użyciu debugera

Jak najbardziej debuger był używany, ustawiony breakpoint na tym wierszu nie zatrzymuje się.

Masz Netbeansa, wiec to jest wygodne

Nie wiem skąd takie przypuszczenie, eksperymentuję z tym środowiskiem już od wersji 8, mi odpowiada.

Aha,

  • używamy słownictwa KOD METODY (tak się nazywa w programowaniu obiektowym) lub "zdarzenia" ze względu na GUI Swinga, ale nie "procedury", >>w `Javie ich nie ma.

Chylę głowę, przepraszam.

  • cokolwiek to długie jest i źle się czyta, Warto wydzielić do jakiś prywatnych metod pomocniczych, przy czym ich najcenniejszą rzeczą będzie NAZWA.
    Nazywanie czegoś ma dużą wartość. Obecnie czytelnik nie bardzo wie, jaki zamiar co do kodu miał autor.

Zamiar opisałem na wstępie, program przetwarza plik tekstowy i generuje inny plik, też tekstowy. Wszystko jest zawarte w tej metodzie.

Pozdr.
Jarek.

1
pigobocian napisał(a):

Jak najbardziej debuger był używany, ustawiony breakpoint na tym wierszu nie zatrzymuje się.

No to zapnij się linijkę wyżej, potem jeszcze wyżej, i zobacz flow wykonywania programu

Zamiar opisałem na wstępie, program przetwarza plik tekstowy i generuje inny plik, też tekstowy. Wszystko jest zawarte w tej metodzie.

No właśnie w tym jest cały szkopuł - wszystko jest zawarte w tej metodzie :) w metodzie też są osobne linijki, które się czyta, a np

                lnbuf = br.readLine();
                if (lnbuf.length() > 110) {
                    xx = new StringBuilder(lnbuf.substring(110).trim());
                    int yy = xx.indexOf("  ");
                    while (yy > 0) {
                        xx.delete(yy, yy + 1);
                        yy = xx.indexOf("  ");
                    }
                }

Nie mówi mi zupełnie nic. Widzę że dajesz komentarze: // zostaw tylko jedną spację miedzy słowami - zamiast tego komentarza wraz z dziwnym blokiem kodu powyżej, lepiej byłoby dać taką linijkę:

xx = leaveOnlyOneSpaceBetweenWords(br);

pomijam już kwestię, że xx powinno mieć jakąś inną nazwę, i być Stringiem niż StringBuilderem.

Anyway, jak widzisz, wyodrębnienie małych metod pozwoli zmniejszyć liczbę linijek do czytania, a to polepsza czytelność kodu.

1

Jak najbardziej debuger był używany, ustawiony breakpoint na tym wierszu nie zatrzymuje się.

No to koniec. Nie da się nic zrobić. Musisz teraz spalić komputer.
Weź łaskawie daj breakpoint na początku tej metody i zobacz CZEMU nie dochodzi ci do tego miejsca.

0

Znalazłem odpowiedź, dziękuję wszystkim za zainteresowanie.
Winna jest jak sami zauważyliście rozlazła konstrukcja metody.
A konkretnie fragment:

           // jeżeli tablica ma mniej niż 11 elementów, to 
            if (elem == null || elem.length < 11) {
                return;
            }

Dziękuję za sugestie.

1
pigobocian napisał(a):

Znalazłem odpowiedź, dziękuję wszystkim za zainteresowanie.
Winna jest jak sami zauważyliście rozlazła konstrukcja metody.

Chciało by się mieć nadzieję, że ku rozwojowi, czyli m.in. przyjmiesz coś z uwag. Wywodzisz się może z Delphi?

0
AnyKtokolwiek napisał(a):
pigobocian napisał(a):

Znalazłem odpowiedź, dziękuję wszystkim za zainteresowanie.
Winna jest jak sami zauważyliście rozlazła konstrukcja metody.

Chciało by się mieć nadzieję, że ku rozwojowi, czyli m.in. przyjmiesz coś z uwag. Wywodzisz się może z Delphi?

W zasadzie zgadłeś - Lazarus.
Jarek.

0

No cóż, kajam się :) nie myślę o sobie jako o programiście, wszystkiego uczę się sam, dlatego kod jest jaki jest. Na eksperymenty mam niewiele czasu stąd "pośpiech w kodzie". Ale pilnie słucham i zapamiętuje.
Chciałem odwzorować w Java narzędzie napisane w Lazarusie. To ledwie jakieś 200 linijek kodu, stąd niedbałość.
Przepraszam, nie powinienem publikować zapytania, tylko cierpliwe krok po kroku drążyć.

2
pigobocian napisał(a):

Na eksperymenty mam niewiele czasu stąd "pośpiech w kodzie"

Tylko że pisząc czytelniejszy kod, pomagasz samemu sobie - w momencie, kiedy conajmniej drugi raz patrzysz na ten kod.

2

Poza tym mało komu się chce pomagac przy nieczytelnym w kodzie. W pracy jak jest tego typu kod to się żąda premi za prace w ciężkich warunkach :D

0
Pinek napisał(a):
pigobocian napisał(a):

Na eksperymenty mam niewiele czasu stąd "pośpiech w kodzie"

Tylko że pisząc czytelniejszy kod, pomagasz samemu sobie - w momencie, kiedy conajmniej drugi raz patrzysz na ten kod.

Dodam: wydzielona metoda z jasnym warunkiem powrotu byłaby sytuacją, ze w/w błąd może w ogóle by nie wystąpił (bo to było jego istotą: ogromna ilość splątanych warunków zakończenia, i nie wiadomo który zadziałał)

1 użytkowników online, w tym zalogowanych: 0, gości: 1