2012-03-07 2 views
-5

Я получаю исключение java.lang.NullPointerException, когда я нажимаю кнопку в этом приложении Java.java.lang.NullPointerException по методу

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

public class MRA_JFrame extends JFrame implements ActionListener 
{ 
    private JTextField ageField; 
    private JTextField smokesField; 
    private JTextField overweightField; 
    private JButton reportButton; 
    private JTextArea log; 
    private Patient patient; 

    public MRA_JFrame() 
    { 
     super("GDM's Medical risk assessment"); 
     setSize(500, 300); 
     setLocation(200, 200); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     setupGUI(); 

     setVisible(true); 
     ageField.requestFocus(); 
    } 

    public void setupGUI() 
    { 
     JPanel westPanel = setupWestPanel(); 
     JPanel centrePanel = setupCenterPanel(); 

     getContentPane().setLayout(new BorderLayout(5, 5)); 
     getContentPane().setBackground(Color.DARK_GRAY); 
     getContentPane().add(westPanel, BorderLayout.WEST); 
     getContentPane().add(centrePanel, BorderLayout.CENTER); 
    } 

    public JPanel setupCenterPanel() 
    { 
     Font f = new Font("Courier New", Font.PLAIN, 12); 

     log = new JTextArea(5, 20); 
     log.setEditable(false); 
     log.setFont(f); 

     JPanel p = new JPanel(new GridLayout(1, 1)); 
     p.add(new JScrollPane(log)); 
     return p; 
    } 

    public JPanel setupWestPanel() 
    { 
     JPanel wnPanel = setupWestNorthPanel(); 
     JPanel wsPanel = setupWestSouthPanel(); 

     JPanel p = new JPanel(new BorderLayout()); 
     p.add(wnPanel, BorderLayout.NORTH); 
     p.add(wsPanel, BorderLayout.SOUTH); 
     return p; 
    } 

    public JPanel setupWestNorthPanel() 
    { 
     ageField = new JTextField(5); 
     smokesField = new JTextField(5); 
     overweightField = new JTextField(5); 

     JPanel agePanel = new JPanel(new GridLayout(1, 2)); 
     agePanel.add(new JLabel("Age: ", JLabel.RIGHT)); 
     JPanel p = new JPanel(); 
     p.add(ageField); 
     agePanel.add(p); 

     JPanel smokesPanel = new JPanel(new GridLayout(1, 2)); 
     smokesPanel.add(new JLabel("Smokes: ", JLabel.RIGHT)); 
     p = new JPanel(); 
     p.add(smokesField); 
     smokesPanel.add(p); 

     JPanel overweightPanel = new JPanel(new GridLayout(1, 2)); 
     overweightPanel.add(new JLabel("Overweight: ", JLabel.RIGHT)); 
     p = new JPanel(); 
     p.add(overweightField); 
     overweightPanel.add(p); 

     JPanel np = new JPanel(); 
     np.setLayout(new BoxLayout(np, BoxLayout.Y_AXIS)); 
     np.add(agePanel); 
     np.add(smokesPanel); 
     np.add(overweightPanel); 

     return np; 
    } 

    public JPanel setupWestSouthPanel() 
    { 
     reportButton = new JButton("Report"); 
     reportButton.addActionListener(this); 

     JPanel p = new JPanel(); 
     p.add(reportButton); 

     return p; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     if(e.getSource() == reportButton) 
     { 
      System.out.println("I'm Clicked!"); 
      patient.setAge(ageField, log); 
     } 
    } 

Класс пациента выглядит следующим образом.

import javax.swing.*; 

public class Patient 
{ 
    private int age; 
    private String smoker; 
    private String overweight; 

    // Consturctor 
    public Patient() 
    { 
     age = 0; 
     smoker = "n"; 
     overweight = "n"; 
    } 

    public void setAge(JTextField age, JTextArea log) 
    { 
     try 
     { 
      this.age = Integer.parseInt(age.getText()); 

     } 
     catch(NumberFormatException nfe) 
     { 
      log.append("Age must be an integer"); 

     } 
    } 

    public void setSmoker(JTextField smoker, JTextArea log) 
    { 
     if(smoker.getText().equalsIgnoreCase("y") || smoker.getText().equalsIgnoreCase("n")) 
     { 
      this.smoker = smoker.getText(); 

     } 
     else 
     { 
      log.append("Smokes must be one 'y', 'Y', 'n' or 'N'"); 
     } 
    } 

    public void setOverweight(JTextField overweight, JTextArea log) 
    { 
     if(overweight.getText().equalsIgnoreCase("y") || overweight.getText().equalsIgnoreCase("n")) 
     { 
      this.overweight = overweight.getText(); 

     } 
     else 
     { 
      log.append("overweight must be one 'y', 'Y', 'n' or 'N'"); 
     } 
    } 
}   

Приложение представит переменные сообщенного пациента и сообщит пользователю, использовали ли они неправильные вводные данные в своем отчете.

+2

Можете ли вы дать полный след? – Ilya

+0

Какая линия для исключения? – talnicolas

+0

Можете ли вы опубликовать трассировку стека – PTBG

ответ

2

Проблема в методе actionPerformed(). Переменная класса patient: null.

Вы можете сделать null чек, как это ...

public void actionPerformed(ActionEvent e) 
{ 
    if(e.getSource() == reportButton && patient != null) 
    { 
     System.out.println("I'm Clicked!"); 
     patient.setAge(ageField, log); 
    } 
} 

Или вы можете initalize переменную ...

public void actionPerformed(ActionEvent e) 
{ 
    if (patient == null) 
    { 
     patient = new Patient(); 
    } 

    if(e.getSource() == reportButton) 
    { 
     System.out.println("I'm Clicked!"); 
     patient.setAge(ageField, log); 
    } 
} 

Или вы initalize переменную, когда вы declare это ...

private Patient patient = new Patient(); 
+0

А я не знал, что вы можете делать нулевые проверки! Brilliant! Спасибо, что помогли и расширили мои знания. – Leon

+0

Нет проблем, мы все здесь для этого. :-) Не забудьте принять ответ. – alexvetter

+0

Вы можете сделать это, нажав зеленую кнопку проверки под кнопкой «Вверх и вниз». – alexvetter

3

Вы не инициализировали переменную patient, поэтому вы пытаетесь получить доступ к свойствам нулевого объекта. Заменить этот

private Patient patient; 

с этим

private Patient patient = new Patient(); 
+0

Спасибо! Я смотрел на него некоторое время, так что я просто смотрю на это, свежие глаза, очевидно, помогли :) – Leon

+0

@ user1254899 затем принять ответ :) –

2

У вас нет ini tialized поле класса patient, например .:

private Patient patient = new Patient(); 
Смежные вопросы