Почему моя программа компилируется, но не запускается? - PullRequest
1 голос
/ 08 мая 2011

Это дополнительный вопрос из-за изменений, внесенных в код OP. Другой пользователь предложил связать другой вопрос с этим.

ОП: Почему компилятор не запускает программу, даже если нет ошибок?

У меня есть код, который компилируется, но он не запускается. Я пытаюсь заставить 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

Ответы [ 5 ]

7 голосов
/ 08 мая 2011

Ну, это определенно не ваш настоящий код, так как у вас есть мошенник b в начале метода menuPanel. Тем не менее, вам нужно взглянуть на трассировку стека:

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

Посмотрите на эти строки в Transaction и определите, где находится нулевой указатель.

Похоже, что эта строка:

summaryMenuItem.addActionListener(new SummaryMenuListener());

Вы не инициализировали summaryMenuItem, поэтому, когда вы пытаетесь вызвать метод по его значению, вы получаете исключение.

Что важнее, чем исправление этой конкретной ошибки, так это узнать как исправить эту ошибку:

  • Посмотрите на трассировку стека
  • Понять, что означает исключение
  • При необходимости запустить код в отладчике, который обычно останавливается при возникновении неперехваченного исключения
  • Если возможно, напишите модульный тест, чтобы вы могли уверенно исправить код
3 голосов
/ 08 мая 2011

Когда код компилируется, он просто не содержит синтаксических ошибок (как вещи сообщаются компилятору), но это не означает, что семантических ошибок не существует (что нужно сделать для достижения цели ).

Если вы внимательно изучите информацию об исключении, в ее нижней части вы найдете:

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

В методе menuPanel класса 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);
}
3 голосов
/ 08 мая 2011

В строке 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);
}

Ваш код работает после этого изменения.

2 голосов
/ 08 мая 2011

Вы получаете NullPointerException в строке 64:

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

Вот эта строка:

summaryMenuItem.addActionListener(new SummaryMenuListener());

Похоже, summaryMenuItem это null, это не похоже набыло установлено любое значение.

0 голосов
/ 08 мая 2011

Вам нужен основной статический метод для запуска программы. Смотрите документы по Java.

...