ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Archie Cobbs <archie.co...@gmail.com>
Subject Re: svn commit: r739577 - /ant/core/trunk/src/main/org/apache/tools/ant/property/NullReturn.java
Date Mon, 02 Feb 2009 15:22:57 GMT
Disassembling the class file shows this:

String.valueOf(null)
  -> INVOKESTATIC java/lang/String.valueOf:([C)Ljava/lang/String;

String.valueOf((Object)null)
  -> INVOKESTATIC
java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;

In the case of an ambiguous method call, the compiler chooses the most
specific one. In this case, char[] is a subclass of Object, so char[] is
chosen.

But if there is no "most specific" one then the compiler gives an ambiguous
method call error.

For example, compile these two classes to see the difference:

Works:

public class Null {
    Null() { foobar(null); }         // char[] variant most specific
    static void foobar(char[] x) { }
    static void foobar(Object x) { }
}

Fails:

public class Null {
    Null() { foobar(null); }          // compiler error
    static void foobar(char[] x) { }
    static void foobar(String x) { }
}

Pretty tricky...

-Archie

On Mon, Feb 2, 2009 at 12:31 AM, <Jan.Materne@rzf.fin-nrw.de> wrote:

> Very curious ...
>
> Source of String.valueOf(Object) from JDK 1.4.2_15
>
>    /**
>     * Returns the string representation of the <code>Object</code>
> argument.
>     *
>     * @param   obj   an <code>Object</code>.
>     * @return  if the argument is <code>null</code>, then a string equal
to
>     *          <code>"null"</code>; otherwise, the value of
>     *          <code>obj.toString()</code> is returned.
>     * @see     java.lang.Object#toString()
>     */
>    public static String valueOf(Object obj) {
>        return (obj == null) ? "null" : obj.toString();
>    }
>
>
> The same for JDK 1.6.0_10
>
>    public static String valueOf(Object obj) {
>        return (obj == null) ? "null" : obj.toString();
>    }
>
>
> But indeed:
> Java 1.3.0-C     : NPE
> Java 1.4.2_15-b02: NPE
> Java 1.5.0_12-b04: NPE
> Java 1.6.0_02-b05: NPE
>
> If I add a cast then it works
>    System.out.println(String.valueOf( (Object)null ));
>
> So the compiler must bind that to another method than
> String.valueOf(Object) ...
>
>
> But of course, simply returning "null" is much easier ;)
>
>
>
> Jan
>
>
>
> > -----Urspr√ľngliche Nachricht-----
> > Von: Martijn Kruithof [mailto:jm@kruithof.xs4all.nl]
> > Gesendet: Samstag, 31. Januar 2009 22:14
> > An: Ant Developers List
> > Betreff: Re: svn commit: r739577 -
> > /ant/core/trunk/src/main/org/apache/tools/ant/property/NullReturn.java
> >
> > Doubted it, checked it and it returned NullPointerException.
> >
> > D:\>type Test.java
> > public class Test
> > {
> > public static void main(String[] args)
> > {
> > System.out.println(String.valueOf(null));
> > }
> > }
> >
> > D:\>java Test
> > Exception in thread "main" java.lang.NullPointerException
> >         at java.lang.String.<init>(Unknown Source)
> >         at java.lang.String.valueOf(Unknown Source)
> >         at Test.main(Test.java:6)
> >
> > br Martijn
> >
> > Matt Benson schreef:
> > > I always thought String.valueOf(null) returned "null".
> > >  Was I on crack?
> > >
> > > -Matt
> > >
> > > P.S.  Good to see you committing, Martijn...
> > >
> > > --- jkf@apache.org wrote:
> > >
> > >
> > >> Author: jkf
> > >> Date: Sat Jan 31 17:10:50 2009
> > >> New Revision: 739577
> > >>
> > >> URL:
> > >> http://svn.apache.org/viewvc?rev=739577&view=rev
> > >> Log:
> > >> Original toString would always throw a NPE.
> > >>
> > >> Modified:
> > >>
> > >>
> > >>
> > >
> > ant/core/trunk/src/main/org/apache/tools/ant/property/NullReturn.java
> > >
> > >> Modified:
> > >>
> > >>
> > >
> > ant/core/trunk/src/main/org/apache/tools/ant/property/NullReturn.java
> > >
> > >> URL:
> > >>
> > >>
> > >
> > http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apach
> > e/tools/ant/property/NullReturn.java?rev=739577&r1=739576&r2=7
> 39577&view=diff
> > >
> > >
> > ==============================================================
> > ================
> > >
> > >> ---
> > >>
> > >>
> > >
> > ant/core/trunk/src/main/org/apache/tools/ant/property/NullReturn.java
> > >
> > >> (original)
> > >> +++
> > >>
> > >>
> > >
> > ant/core/trunk/src/main/org/apache/tools/ant/property/NullReturn.java
> > >
> > >> Sat Jan 31 17:10:50 2009
> > >> @@ -33,6 +33,6 @@
> > >>       * {@inheritDoc}
> > >>       */
> > >>      public String toString() {
> > >> -        return String.valueOf(null);
> > >> +        return "null";
> > >>      }
> > >>  }
> > >>
> > >>
> > >>
> > >>
> > >
> > >
> > >
> > >
> > >
> > >
> > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
> > > For additional commands, e-mail: dev-help@ant.apache.org
> > >
> > >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
> > For additional commands, e-mail: dev-help@ant.apache.org
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
> For additional commands, e-mail: dev-help@ant.apache.org
>
>


-- 
Archie L. Cobbs

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message