2011-05-08 123 views
1

由于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 
+0

从我可以收集的信息来看,似乎是“抱怨”,因为actionPerformed方法中没有任何代码,summaryMenuItem的动作侦听器不会执行任何操作。但是,即使我在ActionPerformed块中放置了一个JOptionPane,我仍然会得到相同的空指针。 – Ryujin89 2011-05-08 09:55:07

+0

NullPointerException意味着您正在尝试调用某个为null的方法。这并不意味着你没有任何代码。 – Kaj 2011-05-08 09:57:01

+0

在阅读了@Jon Skeet和@Kaj之后,我能够进行更改并使代码正常工作。感谢所有协助过的人。 – Ryujin89 2011-05-08 10:13:07

回答

3

东西是零线64 Transaction.java

你要套菜单项。这3个不是空的。

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

这3个是空的:

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); 
} 

你的代码是更改后的工作。

7

那么,这绝对不是你的实际代码,因为你在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,所以当你尝试调用一个方法上的价值,你得到一个例外。

什么比修复此特定的错误,更重要的是学习如何修复虽然错误:

  • 看堆栈跟踪
  • 明白什么异常意味着
  • 如果有必要,运行调试器中的代码,通常在发生未捕获的异常时暂停
  • 如果可能,请编写单元测试,以便您可以放心地修复代码
+0

从我可以收集的内容来看,似乎是“抱怨”,因为actionPerformed方法中没有任何代码,summaryMenuItem的动作侦听器不会执行任何操作。但是,即使我在ActionPerformed块中放置了一个JOptionPane,我仍然会得到相同的空指针。 – Ryujin89 2011-05-08 09:47:40

+1

@ Ryujin89:不,它的抱怨是因为'summaryMenuItem'的值为空。你正在调用一个空引用的方法。你有多少Java经验,出于兴趣?如果您对空引用感到困惑,我会建议您编写一些基本的控制台应用程序,并在编写UI之前从介绍性的书籍中学习... UI编码本身具有一些棘手的方面,并且非常值得坚实基础在你开始尝试更复杂的事情之前。 – 2011-05-08 09:54:08

+0

Jon Skeet抱歉编辑。我想添加一些重要的信息,然后我意识到这不是我的帖子。我想撤消我的编辑,但删除我的部分后无法保存文章。 – 2011-05-08 10:00:00

-1

你需要一个主要的静态方法来开始一个程序。请参阅关于java的文档。

+2

鉴于正在抛出的异常,这显然不是问题。 – 2011-05-08 09:26:03

3

代码编译时,它只是运行没有语法错误(如何告知编译器),但这并不意味着不存在语义错误(为了完成目的)。

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

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

一个空指针正在使用(可能没有正确初始化的变量)类交易的menuPanel方法,这是从事务的构造函数调用的。

检查代码,看来你实际上是使用没有初始化的变量(即空值):

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); 
} 
2

你得到第64行的空指针异常:

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

下面是该行:

summaryMenuItem.addActionListener(new SummaryMenuListener()); 

貌似summaryMenuItemnull,它似乎并没有被设置为任意值。

相关问题