2011-12-01 8 views
0
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at A_test.addButton(A_test.java:27) 
    at A_test.<init>(A_test.java:17) 
    at Main$1.run(Main.java:11) 
    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$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$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) 

メインクラスJavaでこのエラーが発生する理由を説明できる人はいますか?

import javax.swing.*; 

public class Main { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() {     
      public void run() { 
       new A_test(); 
      } 
     }); 
    } 
} 

A_testクラス

import java.awt.event.*; 
import javax.swing.*; 

public class A_test implements ActionListener { 

    private JFrame jf; 

    public A_test() { 
     JFrame jf = new JFrame("A simple swing Program"); 
     jf.setSize(275,100); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JLabel jl = new JLabel("Swing powers the modern JAVA GUI"); 
     jf.getContentPane().add(jl); 
     this.addButton(); 
     jf.setVisible(true); 
    } 

    public void addButton() { 
     JButton jb = new JButton("Submit"); 
     jf.getContentPane().add(jb); 
     jb.addActionListener(this); 
     jf.getContentPane().add(jb); 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) { 
     ((JLabel) jf.getContentPane().getComponent(0)).setText("test"); 
    }  
} 

私は、ラベル付きのJFrameとその中のボタンを作成するために、A_testクラスを使用しています。私がボタンを押すと、アプリケーションはラベルのテキストを以前のものから "テストする"ように変更します。ここで

+0

どちらが27行ですか? – Tudor

+0

@Tudor jf.getContentPane()。add(jb); – DaveJohnston

答えて

4

JFrame jf = new JFrame("A simple swing Program"); 
jf.setSize(275,100); 
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
JLabel jl = new JLabel("Swing powers the modern JAVA GUI"); 
jf.getContentPane().add(jl); 
this.addButton(); 
jf.setVisible(true); 

あなたは新しいJFrameの作成の代わりに、新しいJFrameのにプライベートインスタンス変数を割り当てています。あなたはこの点に達する時までに :

JButton jb = new JButton("Submit"); 
jf.getContentPane().add(jb); 
jb.addActionListener(this); 
jf.getContentPane().add(jb); 

jfはまだnullです。

はちょうどこの操作を行います。

jf = new JFrame("A simple swing Program"); 
jf.setSize(275,100); 
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
JLabel jl = new JLabel("Swing powers the modern JAVA GUI"); 
jf.getContentPane().add(jl); 
this.addButton(); 
+0

+1いい仕事です! – Tudor

1

あなたはJFの2つのインスタンスを持っています。 1つはクラスのメンバであり、初期化されていません。もう一つは、初期化されたコンストラクタ内のローカル変数です。したがって、addButtonが呼び出されるとnullのメンバー変数、つまりNullPointerExceptionにアクセスしようとしています。

1

Eclipseやnetbeansなどのエディタを使い、警告に注意を払う必要があります。彼らは何が間違っていたかを正確に教えてくれたでしょう(あなたの変数はメンバ変数をシャドーイングしていました)。

Javaは素晴らしい警告を出します - Javaの "Pickyness"は、多くの人が言語がより難しいと思うようになりますが、実際にはそれほど簡単になります。構文がゆるい言語は、長期的には本当にはるかに難しいです。

関連する問題