2011-05-08 115 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,它似乎並沒有被設置爲任意值。