Java 15 – Text Block

W Javie 15 dotarł do nas feature o nazwie Text Block, choć w fazie preview był już od bodaj wersji 13.

Mam dla niego nawet doskonały, praktyczny przykład wprost z mojego kursu Kompletna aplikacja w języku Java – od zera do installera ;). Do tej pory, gdy chcieliśmy sformatować wizualnie np. zapytanie do bazy danych

ResultSet resultSet = statement
                    .executeQuery("SELECT R.ID, R.ROOM_NUMBER, B.BED FROM ROOMS AS R LEFT JOIN BEDS AS B ON R.ID=B.ROOM_ID");

Kończyliśmy z czyś takim

Statement statement = SystemUtils.connection.createStatement();
ResultSet resultSet = statement.executeQuery("" +
                            "SELECT " +
                                "R.ID, " +
                                "R.ROOM_NUMBER," +
                                "B.BED " +
                            "FROM " +
                                "ROOMS AS R " +
                            "LEFT JOIN " +
                                "BEDS AS B " +
                            "ON" +
                                " R.ID=B.ROOM_ID");

Używając “bloku tekstu” możemy zapisać to w o wiele przyjemniejszy dla oka sposób:

Statement statement = SystemUtils.connection.createStatement();
ResultSet resultSet = statement.executeQuery("""
                            SELECT 
                              R.ID,
                              R.ROOM_NUMBER,
                              B.BED 
                           FROM
                              ROOMS AS R
                           LEFT JOIN 
                              BEDS AS B 
                           ON
                              R.ID=B.ROOM_ID
                            """);

Odpada nam więc ciągłe otwieranie ” i używanie plusów do łączenia. Blok tekstu zaczynamy i kończymy potrójnym cudzysłowiem """

Dodatkowo wewnątrz bloku możemy do woli korzystać z bez konieczności ciągłego używania \” np.

"""
 Przykład "użycia"
"""

Text block jest traktowany jak zwyczajny String, więc możemy spokojnie zastosowań String.format bądź .replace, by wstrzyknąć tam dane.

int id = 2;

String query  ="""
                    SELECT 
                       ID,
                       ROOM_NUMBER
                    FROM 
                       ROOM
                    WHERE
                       ID = %d 
""";

String finalQuery = String.format(query, id);

Dodano nawet specjalną funkcję do klasy String, by ułatwić powyższe

            int id = 2;

            String finalQuery  ="""
                    SELECT 
                       ID,
                       ROOM_NUMBER
                    FROM 
                       ROOM
                    WHERE
                       ID = %d 
                    """.formatted(id);

Tradycyjnie zapraszam do dołączenia do mojego newslettera, gdzie raz w tygodniu dostarczam artykuł dotyczący programowania w ekosystemie Java, są to treści dedykowane dla uczestników newslettera, nie kopia z bloga.

Java 14 – Więcej informacji przy NullPointerException

Java w wersji 14 daje możliwość uruchomienia rozszerzonych informacji o znanym i lubianym NullPointerException.

Standardowo, gdy odpalimy taki kawałek kodu:

    public static void main(String[] args) {
        howLong(null);
    }
    
    private static int howLong(String s) {
        return s.length();
    }

Dostaniemy taki oto wyjątek:

Exception in thread "main" java.lang.NullPointerException
	at NPEEx.howLong(NPEEx.java:12)
	at NPEEx.main(NPEEx.java:5)

Natomiast, gdy uruchomimy naszą aplikację z dodatkowym argumentem dla Virtual Machine

-XX:+ShowCodeDetailsInExceptionMessages

Dostaniemy już nieco więcej informacji

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "s" is null
	at NPEEx.howLong(NPEEx.java:8)
	at NPEEx.main(NPEEx.java:4)

I o ile w powyższym, prymitywnym przykładzie to nie potrzebujemy pomocy to, gdy mamy do czynienia z typowym anty-patternem “train wreck”:

person.getContactInfo().getAddress().getStreet()

To już dobrze wiedzieć co konkretnie się popsuło. Wówczas dostaniemy taką informację:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Address.getStreet()" because the return value of "ContactInfo.getAddress()" is null
	at NPEEx.main(NPEEx.java:5)

W IntelliJ możemy dodać argument do wirtualnej maszyny w menu Run -> Edit Configurations -> VM Options.

Tradycyjnie zapraszam do dołączenia do mojego newslettera, gdzie raz w tygodniu dostarczam artykuł dotyczący programowania w ekosystemie Java, są to treści dedykowane dla uczestników newslettera, nie kopia z bloga.

Pragmatyczny plan nauki dla ekosystemu Java – v1.1

Jakiś czas temu zapytałem na swojej mailiście o pytania, do nagrania godzinnego i technicznego Q&A z ekosystemu Javy. Jedno spośród pytań było nietechniczne, ale na tyle ciekawe, że postanowiłem przysiąść nad nim poza konkursem. Dodatkowo na tyle popularne, że stwierdziłem, żeby od razu stworzyć wpis na blogu na ten temat.

Chodziło o pokazanie jasnej roadmapy, planu nauki, jak i czego w roku 2020 się uczyć “na juniora”.

No to zaczynamy (i od razu – planuję rozbudowę tego wpisu, ale do tego potrzebuję Twojego feedbacku – po przeczytaniu daj znać na pawel@clockworkjava.pl)

Poziom ZERO

Czytaj dalej Pragmatyczny plan nauki dla ekosystemu Java – v1.1