2014-10-29 51 views
1

好Java異常,我想創建一個計算器的接口。此時,我有一個按鈕,一個問候標籤和一個將成爲計算器主線的標籤。當我運行代碼時,窗口打開並顯示問候語,但按鈕無處可見。終端顯示:鬼例外:在空行

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 

Cannot use this in a static context 

    at Components.Interface.buttons(Interface.java:45) 
    at Components.Interface.main(Interface.java:60) 

事情是,即使45行和60行沒有代碼,Java仍會爲這些行引發異常。它爲什麼這樣做?代碼如下:

package Components; 

import java.awt.event.*; 
import java.awt.*; 

import javax.swing.*; 

public class Interface { 


    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     JFrame frame; 
     JPanel text = new JPanel(); 
     JPanel controlPanel = new JPanel(); 
     JLabel digits = new JLabel(""); 

     frame = new JFrame("Calculator"); 
     frame.setLayout(new FlowLayout()); 
     frame.setPreferredSize(new Dimension(300, 400)); 
     frame.addWindowListener(new WindowAdapter() { 

      public void windowClosing(WindowEvent windowEvent) { 
       System.exit(0); 
      } 
     }); 

     frame.add(text); 
     frame.add(controlPanel); 
     frame.setVisible(true); 
     frame.pack(); 
//about where line 45 is 

     digits.setBorder(BorderFactory.createLineBorder(Color.black)); 
     digits.setSize(new Dimension(30, 20)); 

     text.add(digits); 

     JLabel greet = new JLabel("Welcome to Calculator!"); 
     greet.setSize(30, 20); 
     greet.setVerticalAlignment(SwingConstants.TOP); 
     greet.setBorder(BorderFactory.createLineBorder(Color.black)); 

     text.add(greet); 
//about where line 60 is 
     JButton one = new JButton("1"); 

     one.setSize(100, 30); 

     one.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       digits.setText("1"); 
      } 
     }); 
     controlPanel.add(one); 
    } 
} 
+5

甲迅速響應從未保證。你的問題越好,你會得到更快/更好的迴應。同樣,確保你已經*編譯*你的Java。當Java調試(並解決行號的異常)時,它不會*神奇*知道代碼已經移動,直到您將該信息重新編譯到.class文件。 – Qix 2014-10-29 21:16:53

+2

你現在最大的錯誤是你試圖運行不可編譯的代碼 - 從來不這樣做!相反,找出編譯器告訴你的問題,而不是JVM,然後嘗試修復它們。只有在編譯沒有錯誤後才嘗試運行你的代碼。 – 2014-10-29 21:17:31

+0

「第45行和第60行沒有代碼」 - 我們不知道這些行是什麼。你需要更具體。 – 2014-10-30 10:29:11

回答

3

你現在最大的錯誤就是你試圖運行不可編譯的代碼 - 從來不這樣做!相反,找出編譯器告訴你的問題,而不是JVM,然後嘗試修復它們。只有在編譯沒有錯誤後才嘗試運行你的代碼。

編譯器會再提醒你,你要使用非最終的局部變量,數字,匿名內部類中,這是不允許的。解決方法是將數字聲明爲最終變量。

final JLabel digits = new JLabel (""); 

你可能會問,爲什麼這個奇怪的規定存在,以及內部類是真正的類,甚至是匿名內部類(如您的ActionListener),當Java的創造之一,它使由內使用的局部變量的副本類,並將這些副本傳遞給內部類。如果該變量不是最終的,則副本可能會與原始文件不同步。

+0

@GeneralMartok:感謝您的更正! – 2014-10-30 12:19:01

+0

我使用Eclipse,而據我所知,當按下「運行」按鈕時,文件被自動編譯。當我告訴eclipse在沒有運行的情況下編譯程序時,沒有任何反應。我在這裏只是對java的方式無知,還是有其他的錯誤? – 2014-10-31 21:24:32

+0

@RobintheSprite:我也使用Eclipse。因此,當只盯着Eclipse中的代碼,而不是運行它,你應該看到在左邊距紅'x',問題視圖(我認爲這是我的控制檯視圖選項卡)應列出所有的編譯錯誤和警告,包括任何這個程序。 – 2014-10-31 21:43:05