2013-07-28 45 views
0

我创建了一个Java应用程序,并得到此异常:什么是Java NullPointerException?

Exception in thread "main" java.lang.NullPointerException 
    at java.awt.Container.addImpl(Unknown Source) 
    at java.awt.Container.add(Unknown Source) 
    at javax.swing.JFrame.addImpl(Unknown Source) 
    at java.awt.Container.add(Unknown Source) 
    at Executer.<init>(Executer.java:21) 
    at Executer.main(Executer.java:14 

下面是代码:

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

public class Executer { 

private JLabel lblCommand; 
private JTextField txtEnter; 
private JButton btNext, btPrevious; 
private JPanel panel; 

public static void main(String[] args) { 
    new Executer(); 
} 
public Executer() { 
    JFrame frame = new JFrame("Execute Script"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(900,400); 
    frame.setVisible(true); 
    frame.add(panel); 
    frame.setVisible(true); 
    MyPanel(); 
    Text(); 
    Buttons(); 
    Fields(); 
} 
public void MyPanel() { 
    panel = new JPanel(); 
    panel.setLayout(null); 
} 
public void Text(){ 
    lblCommand = new JLabel("Enter Here"); 
    lblCommand.setBounds(135, 50, 150, 20); 
    Font styleOne = new Font("Arial", Font.BOLD, 13); 
    lblCommand.setFont(styleOne); 
    panel.add(lblCommand); 
} 

public void Fields() { 
    txtEnter = new JTextField(); 
    txtEnter.setBounds(210, 50, 150, 20); 
    panel.add(txtEnter); 
} 
public void Buttons() { 
    btNext = new JButton ("Next"); 
    btNext.setBounds(380,325,100,20); 
    panel.add(btNext); 

    btPrevious = new JButton ("Previous"); 
    btPrevious.setBounds(260,325,100,20); 
    panel.add(btPrevious); 
}} 

什么是空指针异常?我如何知道?

+1

我对Swing应用程序不太了解/关心很多,但我认为你必须以某种方式实例化'panel'。你把它作为'null'传入。 – Makoto

+0

要找出NPE的原因,您应该查看堆栈跟踪以找到从您自己的代码中提到类和方法的第一行。从那里开始回溯到从代码中提到类和方法的最后一行。这会给你一个追踪问题原因的起点。 –

+1

Java GUI可能需要在多种平台上工作,使用不同的屏幕分辨率和使用不同的PLAF。因此,它们不利于组件的准确放置。为了组织强大的图形用户界面,请使用布局管理器或[它们的组合](http://stackoverflow.com/a/5630271/418556)以及[空格]的布局填充和边框(http: //stackoverflow.com/q/17874717/418556)。 –

回答

6

在添加它之前,您需要实例化panel。如果您在拨打MyPanel()之前使用面板,panel仍然是null,因此NullPointerException

当你来到这里时,请一睹为快。 http://geosoft.no/development/javastyle.html

Java中的方法名称应该是混合大小写,以小写字母开头,例如, myPanel()而不是MyPanel()。对于我们大多数人来说,MyPanel()乍一看看起来就像是一个构造函数,因为你的设计不当。

此外,MyPanelTextFields,并Buttons都应该是私有方法,因为这将是不适当的外部类给他们打电话。

1

此行中存在问题frame.add(panel);面板未在该位置初始化,在添加初始化面板之前移动此行MyPanel();进行初始化。

1

正如其他人所说的,在尝试将其添加到JFrame之前,您需要创建JPanel。实际上,您通常应该在JPanel内创建所有组件。我建议你从Executer构造移动呼叫

Text(); 
Buttons(); 
Fields(); 

MyPanel()方法,并呼吁frame.add(panel);之前调用MyPanel()

另外,您不需要拨打frame.setVisible(true);两次。此外,您应该使用LayoutManager而不是致电panel.setLayout(null);。请参阅Using Layout Managers的Oracle教程。

0

是的,您是在创建JPanel对象之前将面板添加到框架。无论如何改变你的构造:

public Executer() { 
     JFrame frame = new JFrame("Execute Script"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(900, 400); 

     MyPanel(); 
     Text(); 
     Buttons(); 
     Fields(); 

     frame.add(panel); 
     frame.setVisible(true); 

    } 

谢谢。