【问题标题】:Copying files to another folder throws java.lang.NullPointerException [duplicate]将文件复制到另一个文件夹会引发 java.lang.NullPointerException [重复]
【发布时间】:2017-03-08 07:13:16
【问题描述】:

程序提示用户使用 FileChooser 选择 1 个或多个文件。
我将其保存到列表中,然后将该列表发送到此处的此方法。然后在选择文件并按下保存后,我在堆栈跟踪中得到一个 NullPointerException。
程序之后仍然继续运行,它确实成功复制了文件。
问题是,到底是什么指向 null这里???我有不到一年的java经验。

public class PhotoManager {

    private final FileChooser fileChooser = new FileChooser();
    private final String pathname = "C:\\JavaAlbumApp";
    private final File dir = new File(pathname);
    //private final Desktop desktop = Desktop.getDesktop();
    protected List<File> photos;

    PhotoManager()
    {


        // If the default directory JavaAlbumApp doesn't exist then create it.
        boolean exists = dir.exists();
        try
        {
            if(!exists)dir.mkdir();    
        }
        catch(SecurityException se)
        {
            System.out.println("Could not create directory");
        }

    }

protected void importFile(Stage primaryStage) 
{ 
        // Set extension filters
        setExtFilters();
        // Set title
        fileChooser.setTitle("Select Picture/s");
        // Prompt user to select the photo/s they want to copy/save
        photos = fileChooser.showOpenMultipleDialog(primaryStage);
        copyFileUsingJava7Files();

    System.out.println(fileChooser.getTitle()); // Select Picture/s
    System.out.println(fileChooser.toString()); // javafx.stage.FileChooser@229f9227
    System.out.println(fileChooser.getInitialFileName()); // null
    System.out.println(fileChooser.getInitialDirectory().getName()); //JavaAlbumApp
    System.out.println(fileChooser.getInitialDirectory().toString()); //C:\JavaAlbumApp
    System.out.println(fileChooser.getInitialDirectory().getPath()); //C:\JavaAlbumApp
    System.out.println(fileChooser.getInitialDirectory().getAbsolutePath()); //C:\JavaAlbumApp
    System.out.println(fileChooser.getInitialDirectory().getParent()); //C:\
}

 private void copyFileUsingJava7Files()
 {   // Step 1: 
     // Copy list of photos to dir variable "C:\\JavaAlbumApp".  
    for(File photo : photos)
    {
        if(photo != null)
        {
            try{
                Files.copy(photo.toPath(), dir.toPath().resolve(photo.getName()));
               //this.desktop.open(photo);
            } catch(IOException e){
               e.printStackTrace();
            }
        }
    }
 }
}

这是堆栈跟踪

ant -f C:\\Users\\edwin\\OneDrive\\Documents\\NetBeansProjects\\PhotoAlbumApp jfxsa-run
init:
Deleting: C:\Users\edwin\OneDrive\Documents\NetBeansProjects\PhotoAlbumApp\build\built-jar.properties
deps-jar:
Updating property file: C:\Users\edwin\OneDrive\Documents\NetBeansProjects\PhotoAlbumApp\build\built-jar.properties
compile:
Detected JavaFX Ant API version 1.3
jfx-deployment:
jar:
Copying 12 files to C:\Users\edwin\OneDrive\Documents\NetBeansProjects\PhotoAlbumApp\dist\run365021180
jfx-project-run:
Executing C:\Users\edwin\OneDrive\Documents\NetBeansProjects\PhotoAlbumApp\dist\run365021180\PhotoAlbumApp.jar using platform C:\Program Files\Java\jdk1.8.0_121\jre/bin/java
Select Picture/s
null
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
    at photoalbumapp.PhotoManager.importFile(PhotoManager.java:63)
    at photoalbumapp.PhotoAlbumApp.lambda$start$0(PhotoAlbumApp.java:122)
    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.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    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.control.MenuItem.fire(MenuItem.java:462)
    at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.doSelect(ContextMenuContent.java:1405)
    at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.lambda$createChildren$343(ContextMenuContent.java:1358)
    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.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:381)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
    at java.lang.Thread.run(Thread.java:745)
Deleting directory C:\Users\edwin\OneDrive\Documents\NetBeansProjects\PhotoAlbumApp\dist\run365021180
jfxsa-run:
BUILD SUCCESSFUL (total time: 18 seconds)

【问题讨论】:

  • fileChooser在哪里初始化?
  • 在最顶部,“public class PhotoManager”下方。这是私人决赛。
  • NPE 出现在PhotoManager.importFile(PhotoManager.java:61),该行指的是哪个语句?
  • 只是 System.out.println(fileChooser.toString());因为我想看看它会打印什么。为简单起见,我将其从代码中排除。
  • 我想我可能错误地复制并粘贴了一个过时的堆栈跟踪。我刚刚更新了堆栈跟踪。对不起。

标签: java javafx file-io nullpointerexception


【解决方案1】:

我相信你的问题是这一行:

photos = fileChooser.showOpenMultipleDialog(primaryStage);

FileChooser#showOpenMultipleDialog 的 Javadoc 说,当没有选择文件时它返回 null。

https://docs.oracle.com/javase/8/javafx/api/javafx/stage/FileChooser.html#showOpenMultipleDialog-javafx.stage.Window-

然后,当 copyFileUsingJava7Files() 尝试遍历设置为 null 的照片集合时,空指针出现在 for(File photo : photos)

【讨论】:

  • 所以要修复它,我必须预先设置照片?我不明白,因为该程序成功地将图像存储到列表照片中。我知道是这样,因为我检查了我的目录并且所有照片都已成功复制。
  • 理想情况下,您应该尝试了解为什么 FileChooser 在保存时不知道选择了哪个文件。
  • 好的,谢谢,我会研究一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 2015-07-12
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多