help-jel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: String null comparison failure


From: Mark Taylor
Subject: Re: String null comparison failure
Date: Tue, 4 Jan 2022 18:34:08 +0000 (GMT)

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 <m.b.taylor@bristol.ac.uk>:
> 
> > 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
> > m.b.taylor@bristol.ac.uk          http://www.star.bristol.ac.uk/~mbt/
> 
> 
> 
> 

--
Mark Taylor  Astronomical Programmer  Physics, Bristol University, UK
m.b.taylor@bristol.ac.uk          http://www.star.bristol.ac.uk/~mbt/



reply via email to

[Prev in Thread] Current Thread [Next in Thread]