空指针java

时间:2014-02-21 04:17:11

标签: java

我正在尝试打开目录获取其名称并从中加载所有图像。在第一个系统打印后我得到一个空指针。我究竟做错了什么?还有更好的方法来编码吗?

这是我的代码:

public void open() {
    JFileChooser chooser = new JFileChooser();
    File studyPath = new File("C:\\");

    chooser.setCurrentDirectory(studyPath); 
    chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

    int returnVal = chooser.showOpenDialog(null);
    if (returnVal == JFileChooser.APPROVE_OPTION) { 

        // gets study path and sets study name
        studyPath = chooser.getSelectedFile();
        studyName = chooser.getName(studyPath);

        // get study images
        int x;
        int y;
        for(File i : studyPath.listFiles()) {
            try {
                FileInputStream file_input_stream = new FileInputStream(i);
                BufferedImage image_file = ImageIO.read(file_input_stream);

                x = image_file.getHeight();
                y = image_file.getWidth();

                int[] res = {x, y};

                StudyImage image = new StudyImage(i.getName(), res, image_file);
                System.out.println(image.toString());
                studyImages.add(image);  

            } catch (FileNotFoundException ex) {
                Logger.getLogger(Study.class.getName()).log(Level.SEVERE, 
                            null, ex);
            } catch (IOException ex) {
                Logger.getLogger(Study.class.getName()).log(Level.SEVERE, 
                            null, ex);
            }  
        }

    }
}

但是在第一个Sys out打印行

之后我得到一个空指针

堆栈追踪:

run:
Image name: ct_head01.jpg    Resolution: [I@5f85f4b7
Exception in thread "main" java.lang.NullPointerException
    at medicalimageviewer.Study.open(Study.java:69)
    at medicalimageviewer.MedicalImageViewer.main(MedicalImageViewer.java:12)
Java Result: 1

什么是研究图像:

private LinkedList<StudyImage> studyImages;

3 个答案:

答案 0 :(得分:3)

即使您未将其添加到帖子中,也不得初始化studyImagesstudyImagesnull)。

// I suggest you use the interface type.
private List<StudyImage> studyImages = new LinkedList<StudyImage>();
// on java 7 and up, you could do
// private List<StudyImage> studyImages = new LinkedList<>();
// or
// private List<StudyImage> studyImages = new ArrayList<>();

答案 1 :(得分:3)

很难说你的班级其余部分都丢失了,但是当你调用它时,你的studyImages变量可能没有被初始化。

我的建议是,最好在声明变量后立即初始化变量(对此有一些例外,例如在构造函数中初始化变量),所以如果它存储为字段,我会写: List<StudyImage> studyImages = new ArrayList<StudyImage>();如果你还没有这样做的话。

答案 2 :(得分:2)

private LinkedList<StudyImage> studyImages;

没有。这是“声明”,它只是指向studyImages 去的地方的指针。必须按照@Elliot Frisch的建议“初始化”。当你打电话时

studyImages.add(image);  

它与NullPointerException崩溃,因为您试图在不存在的对象上调用函数

以下是更多信息: