2012-03-07 13 views
-5

このJavaアプリケーションでボタンをクリックすると、java.lang.NullPointerExceptionが表示されます。java.lang.NullPointerException on method

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

例:フルトレースを渡せますか?patientクラスフィールドを初期化しましたか? – Ilya

+0

例外の行は何ですか? – talnicolas

+0

あなたはスタックトレースを投稿できます – PTBG

答えて

2

この

private Patient patient; 

を交換して問題がactionPerformed()方法です。クラス変数patientnullです。 ...

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それを

あなたが

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

...このようなnullチェックを行うこともできますし、変数をinitalizeすることができます...

private Patient patient = new Patient(); 
+0

ああ私はあなたがヌルチェックを行うことができるか分からなかった!ブリリアント!私の知識を助け、拡大してくれてありがとう。 – Leon

+0

問題はありません。私たちはすべてここにいます。 :-)答えを受け入れることを忘れないでください。 – alexvetter

+0

これは、上下の投票ボタンの下にある緑のチェックボタンをクリックすると実行できます。 – alexvetter

3

patient変数を初期化していないため、nullオブジェクトのプロパティにアクセスしようとしています。 この

private Patient patient = new Patient(); 
+0

ありがとう!私はしばらくそれを見ているので、私はちょうどそれを参照してください、新鮮な目は明らかに助け:) – Leon

+0

@ user1254899答えを受け入れる:) –

2

あなたはiniを持っていません

private Patient patient = new Patient(); 
関連する問題