java - 调用 getter 方法时出现 NullPointerException

标签 java swing nullpointerexception getter

<分区>

我有三个类TestGUIMainFrameReportsJPanel。 MainFrame 对象在 ReportsJPanel 构造函数中作为参数传递。当我尝试调用传递的 MainFrame 对象的 getter 方法并获取私有(private)变量的值时,从 ReportsJPanel 对象我得到 NullPointerException 错误。 ReportsJPanel 中的这一行发生错误 instalationLocation=mainFrame.getInstalationLocation();

TestGUI 代码:

package testgui;

public class TestGUI {

    public static void main(String[] args) {

        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(RiskManagerGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(RiskManagerGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(RiskManagerGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(RiskManagerGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {

                MainFrame mainFrame = new MainFrame();
                mainFrame.initComponents();
                mainFrame.setVisible(true);
            }
        });
    }

}

MainFrame 代码:

package testgui;

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import left_panel_package.ReportsJPanel;

public class MainFrame extends JFrame{

    private String instalationLocation;

    public MainFrame(){
        setInstalationLocation("TEST_Location");
    }

    public void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("TEST");

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout());
        mainPanel.setBackground(new Color(0, 0, 0));

        JPanel leftPanel = new JPanel();
        leftPanel.setBackground(new Color(255, 0, 0));
        leftPanel.setPreferredSize(new Dimension(200,100));
        leftPanel.setLayout(new GridLayout(3,0));

        JPanel rightPanel = new JPanel();
        rightPanel.setBackground(new Color(0, 255, 0));
        rightPanel.setPreferredSize(new Dimension(200,100));

        JPanel centerPanel = new JPanel();
        centerPanel.setBackground(new Color(0, 0, 255));

        JPanel toolBar = new JPanel();
        toolBar.setBackground(new Color(0, 255, 255));
        toolBar.setPreferredSize(new Dimension(100,100));

        ReportsJPanel reportsPanel = new ReportsJPanel(this);
        reportsPanel.initComponents();

        leftPanel.add(reportsPanel);

        mainPanel.add(leftPanel, BorderLayout.WEST);
        mainPanel.add(rightPanel, BorderLayout.EAST);
        mainPanel.add(centerPanel, BorderLayout.CENTER);
        mainPanel.add(toolBar, BorderLayout.NORTH); 

        setContentPane(mainPanel);

        GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        int width = gd.getDisplayMode().getWidth();
        int height = gd.getDisplayMode().getHeight();
        setSize(width, height);
        setLocationRelativeTo(null);
    }

    public String getInstalationLocation() {
        return instalationLocation;
    }

    private void setInstalationLocation(String instalationLocation) {
        this.instalationLocation = instalationLocation;
    }

}

ReportsJPanel 代码:

import javax.swing.JPanel;
import javax.swing.border.TitledBorder;
import testgui.MainFrame;

public class ReportsJPanel extends JPanel{

    private MainFrame mainFrame;
    private String instalationLocation;

    public ReportsJPanel (MainFrame mainframe){

        this.mainFrame=mainFrame;

        setBorder(new TitledBorder("Reports"));

    }
    public void initComponents(){
        instalationLocation=mainFrame.getInstalationLocation();
    }
}

最佳答案

简单的错字。在您的 ReportsJPanel 的构造函数中,您有这个。

public ReportsJPanel(MainFrame mainframe) {
    this.mainFrame = mainFrame;
    setBorder(new TitledBorder("Reports"));
}

您需要将传递给构造函数的 MainFrame 对象中的 f 大写。

public ReportsJPanel(MainFrame mainFrame) {
    this.mainFrame = mainFrame;
    setBorder(new TitledBorder("Reports"));
}

否则,您会将 this.mainFrame 设置为其自身,您传入的 mainframe 将不会被使用。

关于java - 调用 getter 方法时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33244442/

相关文章:

java - 什么是NullPointerException,我该如何解决?

java - 添加用 Java 编译的依赖库总是安全的吗?

java - 如何在 @ComponentScan 中定义另一个模块中 java 类的路径?

java - 基本 JFrame 计算器

java - 为什么 Frames 和 JFrames 默认设置为不可见?

java - 在 Java 中加载文件时的 NPE

java - 访问selenium中结构dom(*ngFor)元素的innerHTML或innerText

Java 如何向下载的 CSV 添加新的空列

java - 将单选按钮组添加到屏幕

android - 在 FragmentStatePagerAdapter NPE 中运行数据库查询