Re: String null comparison failure
Mark Taylor <[email protected]> Tue, 4 Jan 2022 18:34:08 +0000 (GMT)
| Newsgroups | gmane.comp.java.jel.general |
|---|---|
| Message-ID | <7dd57feb-f213-76cf-3c59-7e65cc726c8@IT076926> |
Konstantin, fantastic, many thanks as ever for the fast response. I confirm that this jel-2_1_3-pre1.zip fixes the issue for me. Do you plan to make a numbered 2.1.3 release in the near future? One very minor point about the distribution: the pre-compiled jel.jar and jel_g.jar files use the Java 14 classfile format, so I have to recompile them for my Java 8 target platform. This is no problem to do, but since the code is compatible with earlier classfile versions, it would make it slightly easier to use if jel.jar and jel_g.jar were cross-compiled for whatever is the earliest compatible Java version. I'm not aware of any disadvantages to doing that, though perhaps there's some reason I haven't thought of. Best wishes, Mark On Tue, 4 Jan 2022, Konstantin L. Metlov wrote: > Happy New Year, Mark ! > > Thank you for the bug report ! > > Indeed, JEL used to strictly follow JLS for string comparison, but then for > JEL 0.9.8 someone requested a full string comparison support (complete with > collation rules). It was indeed a very good idea, but since that version the > strings started to be treated differently from other objects. Their comparison > was delegated to java.text.Collator, which by default throws an exception on > null arguments. It was possible to override this behaviour in collator without > modifying JEL, but I agree that not following the JLS for string comparisons > by default is a bug. > > I've made a pre-release version of JEL 2.1.3, fixing this bug (and adding a > few more tests for string comparison) and also committed this fix on Savannah. > You can download the pre-release from: > > http://www.donfti.ru/~metlov/jel-2_1_3-pre1.zip > > The sha256sum is: > db720fdc4dc5679aa43232baea31f47a9fa6b784f30d2cadaac0541af38df9a7 > jel-2_1_3-pre1.zip > > With the best regards, > Konstantin. > > > Quoting Mark Taylor <[email protected]>: > > > Dear Konstantin, > > > > happy new year! And a JEL question. > > > > If I evaluate a string equality test in which one of the operands is null, > > a NullPointerException results, e.g.: > > > > x=="abc" > > > > provokes a NullPointerException if x has the value null. > > Since the equivalent test in Java simply returns false, that's not > > what I was expecting. Is this intended behaviour? > > > > The following program illustrates this: > > > > import gnu.jel.CompiledExpression; > > import gnu.jel.Evaluator; > > import gnu.jel.Library; > > > > public class Cmp { > > public static void main(String[] args) throws Throwable { > > Library lib = new Library(new Class[] {Cmp.ALib.class}, null, > > null, null, null); > > compare("textValue", lib); > > compare("nullValue", lib); > > } > > private static void compare(String func, Library lib) throws > > Throwable { > > String txtExpr = func; > > String cmpExpr = func + "==\"abc\""; > > > > CompiledExpression txtCompex = Evaluator.compile(txtExpr, lib); > > CompiledExpression cmpCompex = Evaluator.compile(cmpExpr, lib); > > > > System.out.println(); > > report(txtExpr, txtCompex); > > report(cmpExpr, cmpCompex); > > } > > private static void report(String expr, CompiledExpression compex) > > throws Throwable { > > System.out.println(expr); > > Object result = compex.evaluate(null); > > System.out.println(" -> " + represent(result)); > > } > > private static String represent(Object obj) { > > if (obj == null) { > > return "null"; > > } > > else if (obj instanceof String) { > > return "\"" + obj + "\""; > > } > > else { > > return obj.toString(); > > } > > } > > public static class ALib { > > public static String textValue() { > > return "text"; > > } > > public static String nullValue() { > > return null; > > } > > } > > } > > > > which produces the output (JEL 2.1.2): > > > > textValue > > -> "text" > > textValue=="abc" > > -> false > > > > nullValue > > -> null > > nullValue=="abc" > > Exception in thread "main" java.lang.NullPointerException > > at > > java.text.RuleBasedCollator.compare(RuleBasedCollator.java:357) > > at > > gnu.jel.CompiledExpression.compare(CompiledExpression.java:352) > > at dump.evaluate_boolean(Unknown Source) > > at > > gnu.jel.CompiledExpression.evaluate(CompiledExpression.java:157) > > at Cmp.report(Cmp.java:25) > > at Cmp.compare(Cmp.java:21) > > at Cmp.main(Cmp.java:10) > > > > Thanks! > > > > Mark > > > > -- > > Mark Taylor Astronomical Programmer Physics, Bristol University, UK > > [email protected] http://www.star.bristol.ac.uk/~mbt/ > > > > -- Mark Taylor Astronomical Programmer Physics, Bristol University, UK [email protected] http://www.star.bristol.ac.uk/~mbt/