Why does my program compile but it not run?
This is a follow up question due to changes being made to the OP code. Another user suggested I link the other question to this one.
The OP is : Why does the compiler not run the program even though there are not any errors?
I have a code that compiles but it does not run. I am trying to get the GUI to run so that I can then add the code to perform the functions I need it to. the code follows as:
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
}
}
The errors that I get in the console are as follows:
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)
开发者_JAVA技巧... 19 more
Well, that definitely isn't your actual code, as you have a rogue b
at the start of the menuPanel
method. However, you basically need to look at the stack trace:
Caused by: java.lang.NullPointerException
at Transaction.menuPanel(Transaction.java:64)
at Transaction.<init>(Transaction.java:37)
Look at those lines within Transaction
and work out where the null pointer is.
It looks like it's this line:
summaryMenuItem.addActionListener(new SummaryMenuListener());
You haven't initialized summaryMenuItem
, so when you try to call a method on its value, you're getting an exception.
What's more important than fixing this particular bug is learning how to fix the bug though:
- Look at the stack trace
- Understand what the exception means
- If necessary, run the code in a debugger, which will usually pause when an uncaught exception is thrown
- If possible, write a unit test so you can fix the code confidently
Something is null on line 64 in Transaction.java
You have to sets of menu items. These 3 aren't null.
JMenuItem transaction = new JMenuItem("Transaction");
JMenuItem summary = new JMenuItem("Summary");
JMenuItem exit = new JMenuItem("Exit");
These 3 are null:
private JMenuItem summaryMenuItem;
private JMenuItem aboutMenuItem;
private JMenuItem exitMenuItem;
Remove the last 3 ones, and use your previous 3 ones in the code.
Your menuPanel method should then look something like this:
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);
}
Your code is working after that change.
When the code compiles, it just sports no syntax errors (how things to do are told to the compiler), but this does not mean that there is no existence of semantic errors (what things to do in order to accomplish the objective).
If you carefully examine the exception information, you'll find, at its bottom:
Caused by: java.lang.NullPointerException
at Transaction.menuPanel(Transaction.java:64)
at Transaction.<init>(Transaction.java:37)
A Null pointer is being used (probably a variable without proper initialisation) in the menuPanel method of class Transaction, which was called from the constructor of transaction.
Examining the code, it seems that you are actually using variables without initialisation (i.e., with null values):
private JMenuItem summaryMenuItem;
private JMenuItem aboutMenuItem;
private JMenuItem exitMenuItem;
In Transaction.menuPanel():
private void menuPanel()
{
//...
summaryMenuItem.addActionListener(new SummaryMenuListener());
aboutMenuItem.addActionListener(new AboutMenuListener());
file.add(transaction);
file.add(summaryMenuItem);
file.add(exitMenuItem);
}
You are getting a NullPointerException on line 64:
Caused by: java.lang.NullPointerException
at Transaction.menuPanel(Transaction.java:64)
Here's that line:
summaryMenuItem.addActionListener(new SummaryMenuListener());
Looks like summaryMenuItem
is null
, it doesn't seem to have been set to any value.
You need a main static method to begin a program. See docs on java.
精彩评论