2013-08-23 7 views
-1

Я новый студент, изучающий Java. Я пытаюсь сделать gui, где пользователь вводит номер, и он отобразит результат. Но я получаю некоторые ошибки, с которыми я не знаком. Я пробовал искать в google, но это не помогло. Любой комментарий будет оценен. Благодарю.nullpointerexception error in java gui

Основной метод с человеком класса

import javax.swing.JFrame; 
    public class person { 
     public static void main(String[] args) { 
      JFrame frame= new guifirst();//line 6 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setVisible(true); 
     } 
    } 

GuiFirst класса

import javax.swing.JFrame; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JButton; 
import javax.swing.JTextField; 
public class guifirst extends JFrame{ 
    private JLabel label; 
    private JLabel label1; 
    private JTextField text; 
    private JButton button; 
    private JPanel panel; 

    public guifirst(){ 
     label=new JLabel("Enter a number"); 
     setSize(450,100); 
     text=new JTextField(15); 
     button=new JButton("Calculate"); 

     class addaction implements ActionListener{ 
      public void actionPerformed(ActionEvent event){ 
       double number=Double.parseDouble(text.getText()); 
       double result=number*number; 
       label1=new JLabel("Your result is"+result); 
      } 
     } 

     ActionListener listener=new addaction(); 
     button.addActionListener(listener); 
     panel=new JPanel(); 
     panel.add(label); 
     panel.add(label1);//line 32 
     panel.add(text); 
     panel.add(button); 
     add(panel); 
    } 
} 

Ошибки:

Exception in thread "main" java.lang.NullPointerException 
     at java.awt.Container.addImpl(Container.java:1090) 
     at java.awt.Container.add(Container.java:410) 
     at person.guifirst.<init>(guifirst.java:32) 
     at person.person.main(person.java:6) 
+0

Пожалуйста, отформатируйте свой код, ant tell, который является строкой 32 на guifirst.java –

ответ

1

вы должн ven't инициализируется label1 так эта линия не может

panel.add(label1); 

Вы пытаетесь инициализировать его в методе, который не будет вызываться до тех пор, пока интерфейс генерируется и кнопка нажата

class addaction implements ActionListener{ 
     public void actionPerformed(ActionEvent event){ 
      double number=Double.parseDouble(text.getText()); 
      double result=number*number; 
      label1=new JLabel("Your result is"+result); 
     } 
    } 

Это не будет работать, потому что этот код не будет выполнен, пока действие не будет выполнено. Component (ярлык) должен быть не null, прежде чем он может быть добавлен к JPanel.

Для начала нужно инициализировать его по умолчанию.

+0

Все правильно, но «асинхронно». Этот код вызывается потоком диспетчеризации событий (синхронно) при нажатии кнопки. Так вот что вам нужно сделать: создать ярлык для результата уже при создании остальной части вашего графического интерфейса и просто установить его текст при нажатии кнопки. – oddparity

+0

@oddparity Aha. Я не знал, как Swing управляет такими событиями, но я имел в виду, что инициализация не произойдет синхронно. Изменена моя формулировка. –

1

Ваша проблема заключается в том, чтобы добавить label1, не создавая экземпляр файла.

panel.add(label1); 

Помните, что переменные типа Object всегда ссылки в Java так, даже если вы экземпляр Label1, прежде чем сделать этот звонок, ваш ActionListener не заменит метку в кадре; он просто изменит ссылку, которую вы имеете на что-то еще, оставив старую метку в контейнере.

Вместо этого вы должны создать экземпляр метки и добавить ее в компонент. Затем в вашем ActionListener используйте метод setText(String), чтобы изменить отображаемую метку.

+0

Нет, «private JPanel panel1» - это нормальное объявление переменной экземпляра. Извините за настоящую верную формулировку. – oddparity

+0

@oddparity лучше? – resueman

1

Из документов на Container#add

Броски: NullPointerException - если комп нулевой

Похоже, что следующая строка является виновником

panel.add(label1); 

Поскольку вы не введите эту переменную до тех пор, пока вы не назовете actionPerformed в своем ActionListener, это все еще null, когда вы пытаетесь добавить его в panel.

0

Попробуйте это

import javax.swing.JFrame; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JButton; 
import javax.swing.JTextField; 

public class guifirst extends JFrame { 
    JLabel label; 
    private JLabel label1; 
    private JTextField text; 
    private JButton button; 
    private JPanel panel; 

    public guifirst() { 
     label = new JLabel("Enter a number"); 
     label1 = new JLabel(); 
     setSize(450, 100); 
     text = new JTextField(15); 
     button = new JButton("Calculate"); 
     class addaction implements ActionListener { 
      public void actionPerformed(ActionEvent event) { 
       double number = Double.parseDouble(text.getText()); 
       double result = number * number; 
       String result_S ="" + result; 
       label1.setText(result_S); 
      } 

     } 
     ActionListener listener = new addaction(); 
     button.addActionListener(listener); 
     panel = new JPanel(); 
     panel.add(label); 
     panel.add(label1); 
     panel.add(text); 
     panel.add(button); 
     add(panel); 
    } 
} 
0

В нижней части трассировки стека исключений говорит вам, где в коде Исключение возник:

at person.guifirst.<init>(guifirst.java:32) 
at person.person.main(person.java:6)** 

выше говорит вам, что что-то в главном методе класс «человек» в строке 6 попытался создать новый объект класса «guifirst», и что-то в конструкторе («<init>») бросило исключение NullPointerException в строке 32 класса guifirst.

Итак: взгляните на строку 32 guifirst.java (без номеров строк, трудно определить, какая строка вашего образца кода). Посмотрите, пытаетесь ли вы получить доступ к методу или свойствам ссылки, которая потенциально может указывать на нуль (а не на экземпляр объекта).

Хорошее эмпирическое правило при диагностике NullPointerExceptions, чтобы начать глядя на периоды («») в вашем коде, и убедившись, что все, что на оставил стороне период гарантированно ссылка на объект. Если эта левая сторона может быть нулевой, то в какой-то момент вы настроитесь на NullPointerException.

Кстати, поскольку вы новичок в Java, вероятно, стоит отметить, что в Java-кодировке существует строго установленное соглашение, что имена типов (то есть для классов, интерфейсов и перечислений) должны начинаться с капитала письмо. Я бы рекомендовал изменить имя вашего класса человека на «Лицо», а «guifirst» - на «GuiFirst».