【问题标题】:Invalid URL/Illegal Argument Exception when using directory path to create a new type "File" object使用目录路径创建新类型“文件”对象时出现无效 URL/非法参数异常
【发布时间】:2016-11-16 20:38:43
【问题描述】:

我在 DirectoryChooser() 方法中使用目录选择器选择图像目录,但在尝试选择目录时出现非法参数异常/无效 URL 异常。

ImageView imgView = new ImageView( strImageList[ count ].getPath() );

这个^是对应于stacktrace中引用的第348行的代码

makeImageViewArr(folder.getAbsolutePath());

这个^是对应于stacktrace中引用的第104行的代码

Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found
    at javafx.scene.image.Image.validateUrl(Image.java:1118)
    at javafx.scene.image.Image.<init>(Image.java:620)
    at javafx.scene.image.ImageView.<init>(ImageView.java:166)
    at ICGPixelReader.makeImageViewArr(ICGPixelReader.java:348)
    at ICGPixelReader.DirectoryChooser(ICGPixelReader.java:104)
    at ICGPixelReader.lambda$addElements1$0(ICGPixelReader.java:205)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Node.fireEvent(Node.java:8411)
    at javafx.scene.control.Button.fire(Button.java:185)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:380)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:294)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:416)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:415)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
    at javafx.scene.image.Image.validateUrl(Image.java:1110)
    ... 49 more

这里是directoryChooser方法

//Handles when user presses button to open file chooser and select
    //the folder of images
    private void DirectoryChooser(){
        DirectoryChooser chooser = new DirectoryChooser();
        chooser.setTitle("Open images folder");
        folder = chooser.showDialog(window);

        //Null directory check
        if(folder == null){
            System.out.println("Null directory");
        }

        //Else make the image array from that folder
        else{
                System.out.println(folder);
                makeImageViewArr(folder.getAbsolutePath());
        }
    }
    //END METHOD

此目录路径将用作另一个方法(makeImageViewArr(String folderName))方法的参数。

//Makes imageView arraylist from all images in a given directory
    private ArrayList<ImageView> makeImageViewArr(String folderName) { 

        System.out.println(folderName);
        //transer file names from directory folder to string array
        File  imagesDir = new File(folderName);
        File[] strImageList = imagesDir.listFiles();
        myMouseHandler mouseHandler = new myMouseHandler();

        //instantiate imageview arraylist
        arrImageList = new ArrayList<ImageView>();

        //get files from folder & start at 1 to ignore ds.Store
        for( int count = 1; count < strImageList.length; count++ ) {
            ImageView imgView = new ImageView( strImageList[ count ].getPath() );
            imgView.setOnMouseClicked( mouseHandler );
            imgView.setFitHeight(500);
            imgView.setFitWidth(500);
            imgView.setPreserveRation(true);
            arrImageList.add( imgView );
        }
        return arrImageList;
    }//END METHOD

【问题讨论】:

  • 您能否将其过滤到特定于您的问题的程度,这将使读者更容易和更快
  • @jthort 是的!我的道歉
  • @jthort 我认为问题所在的两种方法已被提取并发布在顶部
  • 同时发布完整的堆栈跟踪,并确定代码中的哪一行正在抛出它(我们无权访问行号:您可以)。
  • 你不能把它作为文本发布在问题中,而不是一个屏幕截图的链接吗?这几乎是不可读的。

标签: java exception javafx illegalargumentexception


【解决方案1】:

您将文件路径作为字符串传递给ImageView 构造函数:

ImageView imgView = new ImageView( strImageList[ count ].getPath() );

但是,采用 StringImageView 构造函数需要一个 URL。如documentation中所述:

使用从指定 URL 加载的图像分配一个新的 ImageView 对象。

文件路径不是 URL,通常甚至不是有效的 URL(它可能包含非法字符,例如空格)。

因此,您应该传递从文件中获取的 URL,而不是传递路径:

ImageView imgView = new ImageView( strImageList[ count ].getURI().toString() );

顺便说一句,您的DirectorChooser()(原文如此)方法将所选的File 转换为String,然后您将其传递给您的makeImageViewArr(...) 方法,您可以立即从中创建一个File。这很奇怪(至少可以这么说)。只需将方法改成接受文件,直接传文件即可:

private void DirectoryChooser(){
    DirectoryChooser chooser = new DirectoryChooser();
    chooser.setTitle("Open images folder");
    folder = chooser.showDialog(window);

    //Null directory check
    if(folder == null){
        System.out.println("Null directory");
    }

    //Else make the image array from that folder
    else{
            System.out.println(folder);
            makeImageViewArr(folder);
    }
}

private ArrayList<ImageView> makeImageViewArr(File imagesDir) { 

    File[] strImageList = imagesDir.listFiles();
    myMouseHandler mouseHandler = new myMouseHandler();

    //instantiate imageview arraylist
    arrImageList = new ArrayList<ImageView>();

    //get files from folder & start at 1 to ignore ds.Store
    for( int count = 1; count < strImageList.length; count++ ) {
        ImageView imgView = new ImageView( strImageList[ count ].toURI().toString() );
        imgView.setOnMouseClicked( mouseHandler );
        imgView.setFitHeight(500);
        imgView.setFitWidth(500);
        imgView.setPreserveRation(true);
        arrImageList.add( imgView );
    }
    return arrImageList;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    相关资源
    最近更新 更多