2011-12-01 2 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) 

Main 클래스 I 레이블과의 버튼으로 JFrame의를 만들기 위해 A_test 클래스를 사용하고누군가 Java에서이 오류가 발생하는 이유를 설명 할 수 있습니까?

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

import javax.swing.*; 

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

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의 두 인스턴스가 있습니다. 하나는 클래스의 멤버이며 초기화되지 않았습니다. 다른 하나는 초기화 된 생성자 내의 로컬 변수입니다. 따라서 addButton이 호출되면 NullPointerException이라는 null 멤버 변수에 액세스하려고합니다.

1

Eclipse 또는 netbeans와 같은 편집기를 사용하고 경고에주의를 기울여야합니다. 그들은 정확히 무엇이 잘못되었는지 (당신의 변수가 멤버 변수를 섀도 잉하고 있음) 당신에게 말했을 것입니다.

Java는 놀라운 경고를줍니다. Java의 "Pickyness"는 많은 사람들이 언어가 "어렵습니다"라고 생각하게하지만 사실은 훨씬 쉽게 만듭니다. lax 구문을 사용하는 언어는 장기적으로 훨씬 더 어렵습니다.

관련 문제