listFiles()在不应该返回null时返回null。它过去一直工作到最近,并没有被修改

时间:2013-12-03 09:20:48

标签: java batch-file jar nullpointerexception access-rights

public static void main(String[] args) throws InterruptedException {
    // TODO Auto-generated method stub
    while(true)
    {
        ArrayList<File> wallpapers = new ArrayList<File>();
        File dir = new File("C:/Windows/System32/oobe/info/backgrounds/");
        if(dir.listFiles() == null)
            System.out.println("Empty");
        for(File img : dir.listFiles())
        {
            if(img.getName().endsWith(".jpg") && img.getName() != "backgroundDefault.jpg")
                wallpapers.add(img);
        }
        File current = new File("C:/Windows/System32/oobe/info/backgrounds/backgroundDefault.jpg");
        int i = 1;
        for(File img : wallpapers)
        {
            File f = new File("C:/Windows/System32/oobe/info/backgrounds/"+ i++ +".jpg");
            current.renameTo(f);
            File file = new File("C:/Windows/System32/oobe/info/backgrounds/backgroundDefault.jpg");
            img.renameTo(file);
            Thread.sleep(60000);
        }

    }
}   }
}

此代码每分钟更改Windows登录屏幕的背景图像。 listFiles()为dir返回null,我得到一个NullPointerException(File img:dir.listFiles())。我以为文件权限可能有问题,所以我尝试将文件路径更改为我桌面上的目录,并且工作正常。所以我假设我无法访问系统文件,因为我的程序没有足够的权限。我还要确切地说,这段代码直到最近一直运行良好。它没有被修改。我刚刚发现我的登录壁纸不再改变了。 即使程序确实有效,我也无法在通过Eclipse启动程序时修改文件名,但我会将其导出为.jar,并使用具有最高权限的任务计划程序安排它,以便为其提供管理权限,直到它工作没有任何问题,直到最近。我还尝试忽略错误,认为它们与访问权限相关,并尝试通过任务计划程序以及使用批处理文件启动具有最高权限的可执行jar。我甚至尝试通过我用管理员权限打开的cmd启动jar无效但仍然在cmd中说NullPointerException。我有点迷茫并会感激任何帮助。

4 个答案:

答案 0 :(得分:4)

在Windows 7(及更高版本)上,该进程必须使用提升的权限运行写入C:/Windows和类似的目录。但如果这是问题,则会导致不同的错误消息。

我怀疑: 在64位Windows new File("C:/Windows/System32")下运行32位JVM时,将指向C:\Windows\SysWOW64并且info下没有C:\Windows\SysWOW64\oobe - 文件夹

作为测试:

public static void main(String[] args) {
    File sysdir = new File("C:/Windows/System32/oobe/info");
    for(File file:sysdir.listFiles()) {
        System.out.println(file.getName());
    }
}

使用64位JRE运行正常,并在Windows 7 64位上的32位JRE下抛出NullPointerException

因此,您或其他应用程序最近安装了32位jre或更改了您的路径以指向32位jre,从而破坏了您的应用程序。

答案 1 :(得分:1)

  

listFiles()为dir返回null,我得到一个NullPointerException for(File img:dir.listFiles())。

如果此抽象路径名不表示目录,或者发生I / O错误,则“返回null”。所以要么它不是目录,要么发生I / O错误。

你需要针对这种可能性进行防御性编码,而不是仅仅反对断言“它不应该”。它做到了,它可以。

也许你应该删除尾随的/.

答案 2 :(得分:1)

请勿将字符串与==

进行比较
if(img.getName().endsWith(".jpg") && img.getName() != "backgroundDefault.jpg")

使用等于

if(img.getName().endsWith(".jpg") && !(img.getName()).equals("backgroundDefault.jpg"))

答案 3 :(得分:-3)

如果您在NullPointerException行上显示for(File img : dir.listFiles()),则表示变量dirnull,您无法在其上调用listFiles()。您是否尝试过调试它并查看目录路径是否已更改或dir是否已正确设置?