Dobrý den,

narazil jsem na zajímavý problém s generováním čísel řádků do class souboru.
Následující minimalizovaný program vyhodí výjimku, ale stacktracy se liší 
číslem řádky podle toho, čím byl program zkompilován.

public class SourceLines {

        public static class Foo {
                public Foo withHoo(String hoo) {
                        return this;
                }
        }
        
        public static String n() {
                return null;
        }
        
        public static void main(String[] args) throws Exception { // toto je 
radek 13
                Foo f = new Foo()
                        .withHoo("x")
                        .withHoo(n().toUpperCase());
        }

}

Pokud je program zkompilován Eclipsem, vypíše se:

Exception in thread "main" java.lang.NullPointerException
        at SourceLines.main(SourceLines.java:16)

Pokud je program zkompilován pomocí javac -g, vypíše se:

Exception in thread "main" java.lang.NullPointerException
        at SourceLines.main(SourceLines.java:14)

Disassemblováním class souboru zjišťuji, že Eclipse při zkompilování respektuje 
jednotlivé řádky, na kterých se nachází zřetězené metody, zatímco javac to 
nahází na jeden řádek. Použil jsem http://java.decompiler.free.fr/ , ale stejný 
závěr je zřejmý i z volání javap -l -c.

Nevíte, zda se dá javac v tomto nějak ovlivnit? Všude jsem našel jen popis k 
přepínači -g, ale nic nenasvědčuje, že by to šlo ještě zjemnit. (Mimochodem 
JDK7 developer preview se chová stejně.) Přijde mi to jako dost podstatná 
nevýhoda pro používání fluent API, protože to vylučuje zapsání vnořeného výrazu 
do parametru volané metody. 

Nepovažuji vnořené výrazy za obecně dobrou praktiku, ale někdy to nejde jinak, 
aniž by se snížila čitelnost. Výše uvedený příklad je z praxe, kdy jsme takto 
hledali NullPointerException v řetězu přes jednu stránku. Vyvíjeno pod 
Eclipsem, zkompilováno Mavenem (JDK javac), nasazeno na Tomcat (JDK java).

Či znáte jiné alternativy?

Děkuji!

Tomáš Záluský



================================================
...with Ultimate flying is so easy...
http://www.frisbee.cz    http://www.peaceegg.net
================================================

Odpovedet emailem