Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JFileChooser在Windows中与MyComputer的异常_Java_Windows_Swing_Jfilechooser - Fatal编程技术网

Java JFileChooser在Windows中与MyComputer的异常

Java JFileChooser在Windows中与MyComputer的异常,java,windows,swing,jfilechooser,Java,Windows,Swing,Jfilechooser,我使用swing创建了一个文件选择器,仅从windows平台选择图像。我用了一个文件过滤器。从FileFilter类重写的accept方法的代码为: public boolean accept(File f) { System.out.println("File is : " + f.getName() + " " + f); if(f.isDirectory()) return true; String ext = getExtension(f)

我使用swing创建了一个文件选择器,仅从windows平台选择图像。我用了一个文件过滤器。从FileFilter类重写的accept方法的代码为:

public boolean accept(File f) {

    System.out.println("File is : " + f.getName() + "  " + f);

    if(f.isDirectory())
        return true;

    String ext = getExtension(f);    // returns extensions of the files.

    if(ext.equals("jpg") || ext.equals("jpeg") || ext.equals("gif") || ext.equals("tif") || ext.equals("tiff"))
        return true;
    else {
        return false;
}
当从windows桌面选择MyComputer时,它将挂起。以下是我为MyComputer获得的条目:

File is ::{416651E4-9C3C-11D9-8BDE-F66BAD1E3F3A}  ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{416651E4-9C3C-11D9-8BDE-F66BAD1E3F3A}

Exception in thread "Basic L&F File Loading Thread" java.lang.NullPointerException
    at gui.ImageFilter.accept(ImageFilter.java:26)
    at javax.swing.JFileChooser.accept(JFileChooser.java:1576)
    at javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread$1.call(BasicDirectoryModel.java:230)
    at javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread$1.call(BasicDirectoryModel.java:216)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at sun.awt.shell.Win32ShellFolderManager2$ComInvoker$3.run(Win32ShellFolderManager2.java:458)
    at java.lang.Thread.run(Thread.java:619)
文件是:{20D04FE0-3AEA-1069-A2D8-08002B30309D}计算机

下面是我收到的错误消息:

File is ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}  Computer
File is lenovo  C:\Users\lenovo
File is ::{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}  Network
File is ::{031E4825-7B94-4DC3-B131-E946B44C8DD5}  Libraries
File is 4s.txt  C:\Users\lenovo\Desktop\4s.txt
File is cs.bat - Shortcut.lnk  C:\Users\lenovo\Desktop\cs.bat - Shortcut.lnk
File is kaushik.txt  C:\Users\lenovo\Desktop\kaushik.txt
File is rel.txt  C:\Users\lenovo\Desktop\rel.txt
File is SQL Developer.lnk  C:\Users\lenovo\Desktop\SQL Developer.lnk
File is Get Started With Oracle Database 11g Express Edition .lnk  C:\Users\Public\Desktop\Get Started With Oracle Database 11g Express Edition .lnk
双击myComputer后将显示以下内容:

File is ::{416651E4-9C3C-11D9-8BDE-F66BAD1E3F3A}  ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{416651E4-9C3C-11D9-8BDE-F66BAD1E3F3A}

Exception in thread "Basic L&F File Loading Thread" java.lang.NullPointerException
    at gui.ImageFilter.accept(ImageFilter.java:26)
    at javax.swing.JFileChooser.accept(JFileChooser.java:1576)
    at javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread$1.call(BasicDirectoryModel.java:230)
    at javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread$1.call(BasicDirectoryModel.java:216)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at sun.awt.shell.Win32ShellFolderManager2$ComInvoker$3.run(Win32ShellFolderManager2.java:458)
    at java.lang.Thread.run(Thread.java:619)
但是,当我在ext初始化之后添加另一个if条件时:

if (ext == null)
    return false;
它运行良好。我的问题是,如果我的计算机是一个目录,为什么它会受到空测试的困扰?它不应该在目录测试中返回true吗?另一方面,如果它不是使其成为文件的目录,对吗?那么它如何仍然返回true并被文件选择器打开? 或者是他们的另一个特殊角度


先走一步

MyComputer没有问题,因为它出现在列表中,有或没有空条件。请检查FileFilter是如何工作的

如文件所述:

可以在JFileChooser上设置文件过滤器以保留不需要的文件 从出现在目录列表中

因此,如果accept方法返回true,则表示传入的文件将出现在列表中,否则返回false

应用程序挂起,因为我的计算机可能包含的内容。放一个日志,如下所示:

public boolean accept(File f) {
                System.out.println("File is : " + f);
                if(f.isDirectory())
                    return true;.....
在不带null条件的情况下重新运行应用程序,以便再现问题,并使用您看到的输出更新您的问题。答案就在那里

编辑: 我模拟了您的行为,得到以下输出,请使用类似输出更新您的问题,至少最后10行:

File is : Computer
File is : Network
File is : Libraries
File is : Homegroup
File is : C:\
File is : E:\
File is : F:\
Exception in thread "Basic L&F File Loading Thread" java.lang.NullPointerException: 
    at Main$1.accept(Main.java:17)
    at javax.swing.JFileChooser.accept(JFileChooser.java:1617)
    at javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread.run0(BasicDirectoryModel.java:252)
    at javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread.run(BasicDirectoryModel.java:228)
我希望这有帮助


注意:进行过滤的一个更简单的方法是使用FileNameExtensionFilter

在哪个操作系统上运行上面的示例?我做了一个示例测试,但它工作正常。我正在使用Windows7。我假设您的问题与MyComputer无关,因为如果您可以从列表中选择它,则表示accept方法为它返回true。@gyuri我也在使用windows 7。是,accept方法为其返回true,但仅在null测试之后返回。我的问题是,为什么它要麻烦空测试?我的计算机实际上不是更像一个目录吗?如果不是,那是什么?只是想澄清一下,当你运行代码时,没有出现JFileChooser列表中出现的空条件MyComputer?这对我来说不是,但我建议使用FileNameExtensionFilter代替你的自定义FileFilter。希望这有帮助。我已经编辑了这个问题,请看一看!解决此问题后,我一定会尝试FileNameExtensionFilter。还有一个重要细节:您使用的是哪个JDK?我编辑我的答案。请相应地更新问题。我只是在想,如果你有任何设备连接到你的电脑,并且在我的电脑中存在,如果你在浏览器中打开它,而不是你的硬盘分区。我使用的是JDK1.6。唯一连接到我笔记本电脑的设备是我的usb互联网数据卡。嗯。。。尝试不使用USB数据卡。另外,请告诉我在资源管理器中打开计算机时看到的项目列表。当我在Explorer中打开计算机时,我看到:C:\;E:\;和DVD RW驱动器F: