有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing Java运行时错误(GUI类)

我正在尝试制作一个简单的GUI程序来计算剧院收入(成人/儿童/总收入和净收入)。我一直收到一个很长的运行时错误列表,我正在尽可能地遵循我的书中的说明,所以我不知道是什么导致了这些错误

代码如下:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class TheaterRevenue extends JFrame
{
  private JTextField adultTicketPriceTextField;
  private JTextField adultTicketSoldTextField;
  private JTextField childTicketPriceTextField;
  private JTextField childTicketSoldTextField;
  public TheaterRevenue()
  {
    setTitle("Theater Revenue");
    setSize(400, 175);
    JButton calcButton = new JButton("Calculate");
    //Need JButton's Listener
    calcButton.addActionListener(new calcButtonListener());
    //TextFields
    JTextField adultTicketPriceTextField = new JTextField(20);
    JTextField adultTicketSoldTextField = new JTextField(20);
    JTextField childTicketPriceTextField = new JTextField(20);
    JTextField childTicketSoldTextField = new JTextField(20);
    //TextField Labels (20 is field length, adjust as needed)
    JLabel adultTickPrice = new JLabel("Adult Ticket Price");
    JLabel adultTickSold = new JLabel ("Adult Tickets Sold");
    JLabel childTickPrice = new JLabel ("Child Ticket Price");
    JLabel childTickSold = new JLabel ("Child Tickets Sold");
    //Panel Setup
    JPanel mainPanel = new JPanel();
    add(mainPanel);
    mainPanel.add(adultTickPrice);
    mainPanel.add(adultTicketPriceTextField);
    mainPanel.add(adultTickSold);
    mainPanel.add(adultTicketSoldTextField);
    mainPanel.add(childTickPrice);
    mainPanel.add(childTicketPriceTextField);
    mainPanel.add(childTickSold);
    mainPanel.add(childTicketSoldTextField);
    mainPanel.add(calcButton);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
  }
  private class calcButtonListener implements ActionListener
  {
    public void actionPerformed(ActionEvent e)
    {
      String input1, input2, input3, input4;
      double adultTickPrice, adultTickSold, childTickPrice, childTickSold;
      input1 = adultTicketPriceTextField.getText();
      adultTickPrice = Double.parseDouble(input1);
      input2 = adultTicketSoldTextField.getText();
      adultTickSold = Double.parseDouble(input2);
      input3 = childTicketPriceTextField.getText();
      childTickPrice = Double.parseDouble(input3);
      input4 = childTicketSoldTextField.getText();
      childTickSold = Double.parseDouble(input4);
      //Calculations
      double adultGross, adultNet, childGross, childNet, totalGross, totalNet;
      final double keep = 0.20;
      adultGross = (adultTickPrice*adultTickSold);
      adultNet = ((adultTickPrice*adultTickSold)*keep);
      childGross = (childTickPrice*childTickSold);
      childNet = ((childTickPrice*adultTickSold)*keep);
      totalGross = (adultGross+childGross);
      totalNet = (adultNet+adultGross);
      JOptionPane.showMessageDialog(null, adultGross); 
      JOptionPane.showMessageDialog(null, adultNet);
      JOptionPane.showMessageDialog(null, childGross);
      JOptionPane.showMessageDialog(null, childNet);
      JOptionPane.showMessageDialog(null, totalGross);
      JOptionPane.showMessageDialog(null, totalNet);
    }
  }
  public static void main(String[] args)
  {
    new TheaterRevenue();
  }
}

当我运行它并点击计算按钮时,我得到以下错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at TheaterRevenue$calcButtonListener.actionPerformed(TheaterRevenue.java:53)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

共 (1) 个答案

  1. # 1 楼答案

    您有一个变量阴影问题,即,您声明了一组实例字段

    public class TheaterRevenue extends JFrame {
    
        private JTextField adultTicketPriceTextField;
        private JTextField adultTicketSoldTextField;
        private JTextField childTicketPriceTextField;
        private JTextField childTicketSoldTextField;
    

    但随后将它们重新声明为局部变量(在构造函数中)

    public TheaterRevenue() {
        //...
        //TextFields
        JTextField adultTicketPriceTextField = new JTextField(20);
        JTextField adultTicketSoldTextField = new JTextField(20);
        JTextField childTicketPriceTextField = new JTextField(20);
        JTextField childTicketSoldTextField = new JTextField(20);
    

    这意味着当actionPerformed方法试图访问这些实例字段中的值时

    public void actionPerformed(ActionEvent e) {
        //..
        input1 = adultTicketPriceTextField.getText();
    

    该字段仍然是null

    要修复它,请删除构造函数中的声明,并确保正确初始化实例字段

    public TheaterRevenue() {
        //...
        //TextFields
        adultTicketPriceTextField = new JTextField(20);
        adultTicketSoldTextField = new JTextField(20);
        childTicketPriceTextField = new JTextField(20);
        childTicketSoldTextField = new JTextField(20);