2013-07-28 6 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); 
}} 

Что такое NullPointerException? Как я узнаю?

+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() выглядит как конструктор на первый взгляд, потому что вы неправильно начертили его.

Кроме того, MyPanel, Text, Fields и Buttons все должны быть частные методы, как это было бы неприлично внешний класс называть их.

1

Проблема в этой строке frame.add(panel); Панель не инициализируется в этой точке, переместите эту строку MyPanel(); перед добавлением для ее инициализации.

1

Как уже было сказано, вам нужно создать JPanel, прежде чем пытаться добавить его в JFrame. Фактически, вы должны обычно создавать все компоненты внутри JPanel. Я полагаю, что вы перемещаете звонки

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

из Executer конструктора метода MyPanel() и вызвать MyPanel() перед вызовом frame.add(panel);.

Кроме того, вам не нужно звонить frame.setVisible(true); дважды. Кроме того, вы должны использовать LayoutManager, а не звонить panel.setLayout(null);. См. Учебник Oracle для Using Layout Managers.

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

    } 

спасибо.