【问题标题】:Why does my program compile but it not run?为什么我的程序可以编译但不能运行?
【发布时间】:2011-05-08 09:15:30
【问题描述】:

由于对 OP 代码进行了更改,这是一个后续问题。另一位用户建议我将另一个问题链接到这个问题。

OP 是:Why does the compiler not run the program even though there are not any errors?

我有一个可以编译但无法运行的代码。我试图让 GUI 运行,这样我就可以添加代码来执行我需要的功能。代码如下:

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

import java.awt.event.*;

public class Transaction extends JFrame {

private static final long serialVersionUID = 1L;
// JFrame frame = new JFrame("Bank Account - S Standridge");
JMenuBar menuBar;
JMenu file = new JMenu("File");
JMenu edit = new JMenu("Edit");
JMenu about = new JMenu("About");
JMenuItem transaction = new JMenuItem("Transaction");
JMenuItem summary = new JMenuItem("Summary");
JMenuItem exit = new JMenuItem("Exit");
private JPanel mp;
private JPanel tp;
private JPanel bp;
private JButton calcButton;    
private JButton exitButton; 
private JMenuItem summaryMenuItem;
private JMenuItem aboutMenuItem;
private JMenuItem exitMenuItem;

public Transaction() {
    setTitle("Bank Account - S Standridge");

    mp = new JPanel();
    tp = new JPanel();
    bp = new JPanel();

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    setLayout(new BorderLayout());

    menuPanel();        
    transactionPanel();
    BuildButtonPanel();     

    add(mp, BorderLayout.NORTH);
    add(tp, BorderLayout.WEST);
    add(bp, BorderLayout.SOUTH);

    pack();
    setVisible(true);
}

public void summary() {

}

private void menuPanel() {
    b
    menuBar = new JMenuBar();

    setJMenuBar(menuBar);
    setVisible(true);

    menuBar.add(file);
    menuBar.add(edit);
    menuBar.add(about);

    summaryMenuItem.addActionListener(new SummaryMenuListener());
    aboutMenuItem.addActionListener(new AboutMenuListener());

    file.add(transaction);
    file.add(summaryMenuItem);
    file.add(exitMenuItem);


}

private void BuildButtonPanel() {

     // Create a panel for the buttons.
      bp = new JPanel();

      // Create the buttons.
      calcButton = new JButton("Calculate");
      exitButton = new JButton("Exit");

      // Register the action listeners.
      calcButton.addActionListener(new CalcButtonListener());
      exitButton.addActionListener(new ExitButtonListener());

      // Add the buttons to the button panel.
      bp.add(calcButton);
      bp.add(exitButton);

}

private void transactionPanel()
{
    setLayout(new FlowLayout());

    JRadioButton b1 = new JRadioButton("Checkings");
    // b1.addActionListener(this);
    add(b1);

    JRadioButton b2 = new JRadioButton("Savings");
    // b2.addActionListener(this);
    add(b2);



    ButtonGroup bg = new ButtonGroup();
    bg.add(b1);
    bg.add(b2);


    JTextField tf = new JTextField(5);
    add(tf);
  }

}

class CalcButtonListener implements ActionListener
{
   public void actionPerformed(ActionEvent e)
   {

   }
}

class SummaryMenuListener implements ActionListener
   {
      public void actionPerformed(ActionEvent e)
      {

      }
   }

class ExitButtonListener implements ActionListener
   {
      public void actionPerformed(ActionEvent e)
      {
          System.exit(0);
      }
   }

class AboutMenuListener implements ActionListener
   {
      public void actionPerformed(ActionEvent e)
      {
       // Displays Message Box
      }
   }

我在控制台中得到的错误如下:

java.lang.reflect.InvocationTargetException
IWAV0052E Invocation Target Exception creating Transaction
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.eclipse.ve.internal.java.vce.launcher.remotevm.JFCLauncher$1.run(JFCLauncher.java:59)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$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)
Caused by: java.lang.NullPointerException
at Transaction.menuPanel(Transaction.java:64)
at Transaction.<init>(Transaction.java:37)
... 19 more

【问题讨论】:

  • 据我所知,由于 actionPerformed 方法中没有任何代码,summaryMenuItem 的操作侦听器似乎没有做任何事情。但是,即使我在 actionPerformed 块中放置了一个 JOptionPane,我仍然得到相同的空指针。
  • NullPointerException 表示您正试图在某个为空的对象上调用方法。这并不意味着你没有任何代码。
  • 在阅读了@Jon Skeet 和@Kaj 之后,我能够进行更改并使代码正常工作。感谢所有提供帮助的人。

标签: java swing jmenu jmenubar


【解决方案1】:

嗯,这绝对不是您的实际代码,因为您在 menuPanel 方法的开头有一个流氓 b。但是,您基本上需要查看堆栈跟踪:

Caused by: java.lang.NullPointerException
at Transaction.menuPanel(Transaction.java:64)
at Transaction.<init>(Transaction.java:37)

查看Transaction 中的那些行并找出空指针的位置。

好像是这一行:

summaryMenuItem.addActionListener(new SummaryMenuListener());

您还没有初始化summaryMenuItem,所以当您尝试对其值调用方法时,您会遇到异常。

比修复这个特定错误更重要的是学习如何修复这个错误:

  • 查看堆栈跟踪
  • 了解异常的含义
  • 如有必要,在调试器中运行代码,通常会在抛出未捕获的异常时暂停
  • 如果可能,编写一个单元测试,以便您可以自信地修复代码

【讨论】:

  • 据我所知,由于 actionPerformed 方法中没有任何代码,summaryMenuItem 的操作侦听器似乎没有做任何事情。但是,即使我在 actionPerformed 块中放置了一个 JOptionPane,我仍然得到相同的空指针。
  • @Ryujin89:不,它在抱怨,因为summaryMenuItem 的值为空。您正在对空引用调用方法。出于兴趣,您有多少 Java 经验?如果您对空引用感到困惑,我建议您在编写 UI 之前编写一些基本的控制台应用程序并从介绍性书籍中学习...在你开始尝试更复杂的事情之前。
  • Jon Skeet 抱歉编辑。我想添加一些重要信息,然后我意识到这不是我的帖子。我想撤消我的编辑,但删除我的部分后我无法保存帖子。
  • @r.piesnikowski:@John Skeet 可以回滚或修改任何错误的编辑。我会支持在the event dispatch thread 上进行构建,但setSize() 很少是一个好的计划。
  • @r.piesnikowski:回滚。
【解决方案2】:

Transaction.java 中第 64 行的某些内容为空

您必须设置菜单项。这 3 个不为空。

JMenuItem transaction = new JMenuItem("Transaction");
JMenuItem summary = new JMenuItem("Summary");
JMenuItem exit = new JMenuItem("Exit");

这三个是空的:

private JMenuItem summaryMenuItem;
private JMenuItem aboutMenuItem;
private JMenuItem exitMenuItem;

删除最后 3 个,并在代码中使用之前的 3 个。

您的 menuPanel 方法应如下所示:

private void menuPanel() {
    menuBar = new JMenuBar();

    setJMenuBar(menuBar);
    setVisible(true);

    menuBar.add(file);
    menuBar.add(edit);
    menuBar.add(about);

    summary.addActionListener(new SummaryMenuListener());
    //aboutMenuItem.addActionListener(new AboutMenuListener());

    file.add(transaction);
    file.add(summary);
    file.add(exit);
}

您的代码在更改后可以正常工作。

【讨论】:

    【解决方案3】:

    当代码编译时,它只是显示没有语法错误(告诉编译器如何做),但这并不意味着不存在语义错误(为了完成目标要做什么)。

    如果你仔细检查异常信息,你会发现,在它的底部:

    Caused by: java.lang.NullPointerException
    at Transaction.menuPanel(Transaction.java:64)
    at Transaction.<init>(Transaction.java:37)
    

    在 Transaction 类的 menuPanel 方法中使用了 Null 指针(可能是未正确初始化的变量),该方法是从 transaction 的构造函数中调用的。

    检查代码,您似乎实际上是在使用没有初始化的变量(即具有空值):

    private JMenuItem summaryMenuItem;
    private JMenuItem aboutMenuItem;
    private JMenuItem exitMenuItem;
    

    在 Transaction.menuPanel() 中:

    private void menuPanel()
    {
        //...
        summaryMenuItem.addActionListener(new SummaryMenuListener());
        aboutMenuItem.addActionListener(new AboutMenuListener());
    
        file.add(transaction);
        file.add(summaryMenuItem);
        file.add(exitMenuItem);
    }
    

    【讨论】:

      【解决方案4】:

      您在第 64 行收到 NullPointerException:

      Caused by: java.lang.NullPointerException
      at Transaction.menuPanel(Transaction.java:64)
      

      这是那行:

      summaryMenuItem.addActionListener(new SummaryMenuListener());
      

      看起来summaryMenuItemnull,它似乎没有被设置为任何值。

      【讨论】:

        【解决方案5】:

        您需要一个 main 静态方法来开始一个程序。请参阅有关 java 的文档。

        【讨论】:

        • 这显然不是问题,考虑到正在抛出的异常。
        猜你喜欢
        • 1970-01-01
        • 2018-05-21
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 2016-01-11
        • 1970-01-01
        • 1970-01-01
        • 2020-03-24
        相关资源
        最近更新 更多