Wybiórcze wykonywanie kodu w NetBeans

0

Piszę prosty projekt konsolowy w Javie (projekt w NetBeans 8.2), ale fragment kodu (oznaczony na listingach) nie chce się wykonać, mimo że ja uważam, że powinien.

Program wykonuje pewien algorytm, a jego wyniki wypisuję do konsoli metodą z mojej własnej klasy ConsoleReadWrite.write.

Metoda main wygląda tak:

public static void main(String[] args)
{
    // tu inicjalizacja zmiennych, obliczenia algorytmu

    System.out.println("To jeszcze wypisuje");
    ConsoleReadWrite.write(swapCount);
    System.out.println("Tego juz nie wypisuje :(");
}

Natomiast moja metoda write wygląda tak:

public class ConsoleReadWrite
{
    // tu inne metody

    public static void write(int output)
    {
        try (BufferedWriter bw = new BufferedWriter(
                new OutputStreamWriter(System.out)
        )) {
            bw.write(String.valueOf(output)); // tu wypisuje poprawną odpowiedź
            bw.newLine();
            bw.flush();
            System.out.println("To jeszcze wypisuje");
        } catch (IOException ex) {
            // tu wypisz wyjątek do konsoli
        }
        System.out.println("Tego juz nie wypisuje :(");
    }
}

Program kończy się bez błędów – BUILD SUCCESSFUL (total time: 0 seconds). Nie pomogło wyczyszczenie projektu ani stworzenie go na nowo. Może wy znajdziecie. Dlaczego w miejscach, w których są komentarze, nie wypisuje? Może nie powinien jednak wypisywać?

0

Dodaj finally zeby zamknac bw.
Zapnij sie debuggerem i przejdz krok po kroku. Bedzie najprosciej.

2

Wygląda na to, że zamykasz System.out (pośrednio mechanizmem try-with-resources). Sprawdź następujący kod:

class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		System.out.close();
		System.out.println("wypisujemy to czy nie?");
	}
}

https://www.ideone.com/HqnXKg

Jaki jest w ogóle sens opakowywania String.out w kolejne Writery?

0

Przeniosłem otwarcie strumienia do wnętrza bloku try i zadziałało. :) :) Głupi błąd.

@Wibowit, jaki sens? Robię też operacje na plikach, chciałem wszystkie strumienie obsługiwać w podobny sposób, w podobnych klasach i metodach. Jak widać, nie wszystko się da.


UPDATE: @WhiteLightning, dzięki, o debuggerze nie pomyślałem w ogóle, ale to i tak by chyba nie pomogło, ponieważ nie wpadłoby mi do głowy sprawdzić stan System.out.

0

No to teraz będziesz miał podwójne buforowanie (raz w System.out, a raz w swoich Writerach) i będziesz miał problem jeśli będziesz chciał na przemian korzystać z System.out i swojej nakładki.

Przemyśl swoje abstrakcje jeszcze raz i nie opakowuj System.out w kolejne bufory.

0

Czyli System.out nie powinien być nigdy buforowany?

1

System.out jest buforowany, więc nie ma sensu dodatkowo go buforować. Jak chcesz to możesz zrobić i 10 poziomów buforowania, ale to nie ma sensu. Jeden bufor to rozsądne maksimum.

0

Dobrze, będę pamiętać.

1

Samo buforowanie System.out łatwo sprawdzić. Wystarczy używać metod print i println, a pomiędzy nimi np Thread.sleep i obserwować kiedy pojawi się tekst na ekranie. Implicit flush jest zawsze podczas println i wtedy tekst jest wypychany z bufora, ale flush może nastąpić też wskutek wywołania wprost (flush to metoda publiczna) lub przy wypełnieniu bufora (zawartość trzeba wypchnąć, by zrobić miejsce na kolejne dane).

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