无法使用.getResource(fullPath)打开文件

时间:2018-10-03 15:17:01

标签: java file intellij-idea

我正在尝试在Mac上打开文件。该文件位于主文件包的外部。我收到错误

Exception in thread "main" java.lang.NullPointerException

JFileChooser chooser = new JFileChooser();
        FileNameExtensionFilter filter = new FileNameExtensionFilter(
                "WAV files", "wav");
        chooser.setFileFilter(filter);
        int returnVal = chooser.showOpenDialog(yourJFrame);
        if(returnVal == JFileChooser.APPROVE_OPTION) {
            System.out.println("You chose to open this file: " +
                    chooser.getSelectedFile().getName());
        }

        File file = chooser.getSelectedFile();
        String fullPath = file.getAbsolutePath();

       >> AudioClip clip = Applet.newAudioClip(Main.class.getResource(fullPath));
        clip.play();

错误标有>>

3 个答案:

答案 0 :(得分:0)

请尝试执行此操作:

URL url = file.toURI().toURL()
AudioClip clip = Applet.newAudioClip( url );

Class.getResource有点问题,它默认情况下假设路径是相对的,并且在某种程度上取决于所使用的类加载器。

您还确定已选择文件,您的if语句仅包装println而不包装其余功能,这意味着如果未选择文件,则可能还会出现空指针。尽管NPE会在上面的行中发生。

此外,我还要避免使用AWT,因为它已被swing取代,而它本身已被javafx取代。

答案 1 :(得分:0)

Class.getResource的参数不是文件名。这是一个相对URL,其基础是类路径中每个条目的根。 getResource可以从不检索类路径之外的文件。由于您的文件名不是相对于类路径根目录的有效URL,因此getResouce方法返回null(作为documented)。

您可以按照Jack Moxley的建议进行操作,然后将文件正确转换为URL。

但是,the Applet class is deprecated。您应该使用javax.sound.sampled package播放声音:

try {
    Clip clip = AudioSystem.getClip();
    clip.open(AudioSystem.getAudioInputStream(file));
    clip.start();
} catch (UnsupportedAudioFileException | LineUnavailableException | IOException e) {
    throw new RuntimeException(e);
}

答案 2 :(得分:-1)

此字符串正常工作吗?

System.out.println("You chose to open this file: " +
                    chooser.getSelectedFile().getName());