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 ================================================