Hello Bernd,

On 05/10/18 2:51 PM, Bernd Eckenfels wrote:
> Why does that actually throw an Exception on Linux/Unix, it is a
> perfectly legal file name.
In the context of my test and the issue reported in Apache Ant, it fails
on Linux/Unix because there isn't actually a file present at that path.
So it's a genuine NoSuchFileException and _isn't_ an implementation bug:

Exception in thread "main" java.nio.file.NoSuchFileException: /tmp/*

The reason I used a non-existent file in my sample, is to illustrate the
difference in the exception thrown by Java 11 on Windows and *nix.

-Jaikiran


>
> Gruss
> Bernd
>
> Gruss
> Bernd
> -- 
> http://bernd.eckenfels.net
>  
> ------------------------------------------------------------------------
> *Von:* -2122936656m Auftrag von
> *Gesendet:* Freitag, Oktober 5, 2018 11:00 AM
> *An:* core-libs-dev@openjdk.java.net
> *Betreff:* Re: JarFile constructor throws undocumented exception
> (only) on Windows OS
>  
> Just for reference - this came up while debugging an issue, that one of
> our users of Apache Ant project raised here
> https://bz.apache.org/bugzilla/show_bug.cgi?id=62764#c8
>
> -Jaikiran
>
>
> On 04/10/18 3:06 PM, Jaikiran Pai wrote:
> > Please consider the following trivial code:
> >
> > import java.util.jar.*;
> > import java.io.*;
> >
> > public class JarFileTest {
> >     public static void main(final String[] args) throws Exception {
> >         final String tmpDir = System.getProperty("java.io.tmpdir");
> >         try {
> >             final JarFile jarFile = new JarFile(tmpDir + File.separator
> > + "*");
> >         } catch (IOException ioe) {
> >             System.out.println("Got the expected IOException " + ioe);
> >         }
> >     }
> > }
> >
> > The constructor of the JarFile is passed a string which
> intentionally is
> > an (wildcard) invalid path. The above code (as expected) throws an
> > IOException on *nix systems across various version of Java (tested
> > against Java 8, 11). The same code throws an IOException (as expected)
> > in Java 8 on Windows OS too. However, in Java 11, on Windows OS, this
> > code throws a different exception (java.nio.file.InvalidPathException)
> > which isn't IOException or a subclass of it:
> >
> > Exception in thread "main" java.nio.file.InvalidPathException: Illegal
> > char <*> at index 38: C:\Users\someone\AppData\Local\Temp\1\*
> > at
> >
> java.base/sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:182)
>
> > at
> java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:153)
> > at
> java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)
> > at java.base/sun.nio.fs.WindowsPath.parse(WindowsPath.java:92)
> > at
> >
> java.base/sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:229)
>
> > at java.base/java.io.File.toPath(File.java:2290)
> > at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1220)
> > at
> >
> java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:727)
>
> > at
> java.base/java.util.zip.ZipFile$CleanableResource.get(ZipFile.java:845)
> > at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:245)
> > at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:175)
> > at java.base/java.util.jar.JarFile.<init>(JarFile.java:341)
> > at java.base/java.util.jar.JarFile.<init>(JarFile.java:312)
> > at java.base/java.util.jar.JarFile.<init>(JarFile.java:251)
> > at JarFileTest.main(JarFileTest.java:8)
> >
> >
> > The javadoc of JarFile constructor(s) mentions that:
> >
> >      * @throws IOException if an I/O error has occurred
> >
> > Given that the javadoc doesn't mention anything about this other
> > exception, would this throwing of java.nio.file.InvalidPathException be
> > considered a bug in the implementation?
> >
> > If this indeed is considered a bug, it appears to be the code in
> > java.util.zip.ZipFile$Source.get method which calls File#toPath(),
> which
> > as per its javadoc is indeed expected to throw an
> > java.nio.file.InvalidPathException if a Path cannot be constructed out
> > of the File. Looking at the implementation of the underlying
> > java.nio.file.FileSystem on *nix and Windows, they differ when it comes
> > to whether or not the exception gets thrown (Unix one seems to always
> > return a result). But keeping the implementation of
> > java.nio.file.FileSystem aside, I guess the
> > java.util.zip.ZipFile$Source.get code needs to have a catch block for
> > the InvalidPathException to wrap that into a IOException? Something
> like:
> >
> >
> > # HG changeset patch
> > # User Jaikiran Pai <jaikiran....@gmail.com>
> > # Date 1538645309 -19800
> > #      Thu Oct 04 14:58:29 2018 +0530
> > # Node ID ff1bfd8cc9a3b385716fa5191bb68989d552f87e
> > # Parent  8705c6d536c5c197d0210acccf145ebc48f90227
> > Wrap and throw an IOException when a InvalidPathException is thrown
> >
> > diff --git a/src/java.base/share/classes/java/util/zip/ZipFile.java
> > b/src/java.base/share/classes/java/util/zip/ZipFile.java
> > --- a/src/java.base/share/classes/java/util/zip/ZipFile.java
> > +++ b/src/java.base/share/classes/java/util/zip/ZipFile.java
> > @@ -35,6 +35,7 @@
> >  import java.lang.ref.Cleaner.Cleanable;
> >  import java.nio.charset.Charset;
> >  import java.nio.charset.StandardCharsets;
> > +import java.nio.file.InvalidPathException;
> >  import java.nio.file.attribute.BasicFileAttributes;
> >  import java.nio.file.Files;
> >  import java.util.ArrayDeque;
> > @@ -1218,8 +1219,13 @@
> >  
> >  
> >          static Source get(File file, boolean toDelete) throws
> IOException {
> > -            Key key = new Key(file,
> > -                              Files.readAttributes(file.toPath(),
> > BasicFileAttributes.class));
> > +            final Key key;
> > +            try {
> > +                key = new Key(file,
> > +                        Files.readAttributes(file.toPath(),
> > BasicFileAttributes.class));
> > +            } catch (InvalidPathException ipe) {
> > +                throw new IOException(ipe);
> > +            }
> >              Source src;
> >              synchronized (files) {
> >                  src = files.get(key);
> >
> >
> > Any thoughts?
> >
> >
> > -Jaikiran
> >
>

Reply via email to