1

これは、OPコードに変更が加えられたためのフォローアップの質問です。別のユーザーは、他の質問をこの質問にリンクすることを提案しました。

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
4

5 に答える 5

7

メソッドbの開始時に不正が存在するため、これは実際のコードではありません。menuPanelただし、基本的にはスタックトレースを確認する必要があります。

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

中のそれらの行を見てTransaction、nullポインタがどこにあるかを調べてください。

この行のように見えます:

summaryMenuItem.addActionListener(new SummaryMenuListener());

初期化していないsummaryMenuItemため、その値でメソッドを呼び出そうとすると、例外が発生します。

この特定のバグを修正するよりも重要なのは、バグを修正する方法を学ぶことです。

  • スタックトレースを見てください
  • 例外の意味を理解する
  • 必要に応じて、デバッガーでコードを実行します。デバッガーは通常、キャッチされない例外がスローされると一時停止します。
  • 可能であれば、自信を持ってコードを修正できるように単体テストを作成してください
于 2011-05-08T09:22:56.533 に答える
3

Transaction.javaの64行目で何かがnullになっています

メニュー項目のセットが必要です。これらの3つはnullではありません。

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

これらの3つはnullです:

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

その変更後、コードは機能しています。

于 2011-05-08T09:22:21.913 に答える
3

コードがコンパイルされるとき、構文エラー(コンパイラーに指示される方法)はありませんが、これはセマンティックエラー(目的を達成するために行うこと)が存在しないことを意味するものではありません。

例外情報を注意深く調べると、下部に次のことがわかります。

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

トランザクションのコンストラクターから呼び出されたクラスTransactionのmenuPanelメソッドで、Nullポインター(おそらく適切な初期化のない変数)が使用されています。

コードを調べると、実際には初期化なしで(つまり、null値で)変数を使用しているようです。

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);
}
于 2011-05-08T09:26:56.067 に答える
2

64行目でNullPointerExceptionが発生しています。

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

その行は次のとおりです。

summaryMenuItem.addActionListener(new SummaryMenuListener());

のように見えますsummaryMenuItemnull、どの値にも設定されていないようです。

于 2011-05-08T09:27:12.907 に答える
-1

プログラムを開始するには、メインの静的メソッドが必要です。Javaのドキュメントを参照してください。

于 2011-05-08T09:25:35.113 に答える