10
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 并且我在 for(File img : dir.listFiles()) 上得到 NullPointerException。我认为文件权限可能存在问题,所以我尝试将文件路径更改为我桌面上的目录,它工作正常。所以我假设我无法访问系统文件,因为我的程序没有足够的权限。让我也准确地说,这段代码直到最近都可以正常工作。它没有被修改。我刚刚发现我的登录壁纸不再改变了。即使程序运行正常,当我通过 Eclipse 启动程序时,我也无法修改文件名,但我会将其导出为 . jar 并使用具有最高权限的任务计划程序对其进行调度,以赋予它管理员权限,并且直到最近它都可以正常工作。我还尝试忽略错误,认为它们与访问权限有关,并尝试通过任务计划程序并使用批处理文件以最高权限启动我的可执行 jar。我什至尝试通过使用管理员权限打开的 cmd 启动 jar,但无济于事,它仍然在 cmd 中显示 NullPointerException。我有点迷茫,不胜感激。

4

4 回答 4

7

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

我怀疑:在64位Windows下运行32位JVMnew File("C:/Windows/System32")时会指向C:\Windows\SysWOW64并且没有info-Folder下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 下运行良好,并NullPointerException在 Windows 7 64 位上运行在 32 位 JRE 下。

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

于 2013-12-03T09:50:48.213 回答
1

不要将字符串与==

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

使用等于

if(img.getName().endsWith(".jpg") && !(img.getName()).equals("backgroundDefault.jpg"))
于 2013-12-03T09:29:50.373 回答
1

listFiles() 为 dir 返回 null 并且我在 for(File img : dir.listFiles()) 上得到 NullPointerException。

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

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

也许你应该删除尾随/.

于 2013-12-03T09:26:06.563 回答
-5

如果你得到一个NullPointerException就行for(File img : dir.listFiles()),这意味着变量dirnull并且你不能调用listFiles()它。您是否尝试过调试它并查看目录路径是否已更改或dir实际上设置正确?

于 2013-12-03T09:25:54.263 回答