[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: |
Fri, 7 Jan 2022 09:06:40 +0000 (GMT) |
Thanks Konstantin, I look forward to the next release.
Fair enough about the target JVM. Up till now I have, thankfully,
found Java backward compatibility to be pretty good, but I see there
are risks. You're right that it's easy to rebuild as required.
Thanks again,
Mark
On Thu, 6 Jan 2022, Konstantin L. Metlov wrote:
> Great that the fix works !
>
> Eventually (after more changes are accumulated) yes, there will be a next
> release.
>
> The downside is that JDK is a moving target. A compatible version today can
> become incompatible after the next JDK release and "the earliest compatible"
> is most endangered in this respect.
>
> It should not be difficult to rebuild JEL with ant. Just go to the "./source"
> directory of the distribution and run "ant dist-test". This will build
> everything with your default java, run all the tests and assemble the
> distribution under "./source/build/dist" putting the .jar files in
> "./source/build/dist/lib". On my machine the build time is 15 seconds.
>
> With the best regards,
> Konstantin.
>
> Quoting Mark Taylor <m.b.taylor@bristol.ac.uk>:
>
> > 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/
>
>
>
--
Mark Taylor Astronomical Programmer Physics, Bristol University, UK
m.b.taylor@bristol.ac.uk http://www.star.bristol.ac.uk/~mbt/