2012-01-31 25 views
2

テキストフィールドからテキストを取得しようとしていますが、プログラムを実行するたびにNullPointerExceptionが発生します。私がインターネット上で見つけた同様の問題は、テキストフィールドがローカル変数として再宣言されていることを伴いますが、私はここでそれをやっているのか分かりません。getText()を使用したNullPointerException

エラーは、次のとおり指定された行に

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 

。すべてのヘルプははるかに高く評価されるだろう

EDIT:テキストが空の場合

この短いプログラムは問題

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class Test{ 

public static final Test application = new Test(); 
private JFrame jFrame = null; 
private JPanel jContentPane = null, buttonsPanel = null, cardPanel = null, manualPanel = null, uploadPanel = null, 
     defaultPanel = null; 
private JPanel[] mainPanel = {getDefaultPanel(), getManualPanel(), getUploadPanel()}; 
private JButton manualButton = null, uploadButton = null, manualAssignButton = null; 
private JTextField manualEntryField = null; 
private JLabel manualLabel = null; 

final static String DEFAULTPANEL = "Default"; 
final static String MANUALPANEL = "Manual"; 
final static String UPLOADPANEL = "Upload"; 

/** 
* Main method 
* @param args 
*/ 
public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      application.getJFrame().setVisible(true); 
     } 
    }); 
} 

/** 
* Get the main application frame 
* @return JFrame 
*/ 
private JFrame getJFrame() { 
    if (jFrame == null) { 
     jFrame = new JFrame(); 
     jFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
     jFrame.setResizable(false); 
     // Add the main content pane 
     jFrame.setContentPane(getJContentPanel()); 
     jFrame.addWindowListener(new java.awt.event.WindowAdapter() { 
      public void windowClosing(java.awt.event.WindowEvent e) {  
       closeApplication(); 
      } 
     }); 
    } 
    jFrame.pack(); 
    jFrame.setLocationRelativeTo(null); 
    return jFrame; 
} 

/** 
* Get main content 
* @return JPanel 
*/ 
private JPanel getJContentPanel(){ 
    if (jContentPane == null) { 
     jContentPane = new JPanel(); 
     jContentPane.setPreferredSize(new Dimension(500, 200)); 
     jContentPane.setLayout(new BorderLayout()); 
     jContentPane.add(getButtonsPanel(), BorderLayout.NORTH); 
     jContentPane.add(getCardPanel(), BorderLayout.CENTER); 
    } 
    return jContentPane; 
} 

private JPanel getButtonsPanel() { 
    if(buttonsPanel == null){ 
     buttonsPanel = new JPanel(); 
     buttonsPanel.setPreferredSize(new Dimension(500, 50)); 
     buttonsPanel.setBorder(BorderFactory.createLineBorder(Color.gray)); 

     manualButton = new JButton("Enter manually"); 
     manualButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       CardLayout cl = (CardLayout)(cardPanel.getLayout()); 
       cl.show(cardPanel, MANUALPANEL); 
      } 
     }); 

     uploadButton = new JButton("Upload file"); 
     uploadButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       CardLayout cl = (CardLayout)(cardPanel.getLayout()); 
       cl.show(cardPanel, UPLOADPANEL); 
      } 
     }); 

     buttonsPanel.add(manualButton); 
     buttonsPanel.add(uploadButton); 
    } 
    return buttonsPanel; 
} 

private JPanel getCardPanel() { 
    if(cardPanel == null){ 
     cardPanel = new JPanel(new CardLayout()); 
     cardPanel.setPreferredSize(new Dimension(500, 200)); 
     cardPanel.setBorder(BorderFactory.createLineBorder(Color.gray)); 
     cardPanel.add(mainPanel[0], DEFAULTPANEL); 
     cardPanel.add(mainPanel[1], MANUALPANEL); 
     cardPanel.add(mainPanel[2], UPLOADPANEL); 
    } 
    return cardPanel; 
} 

private JPanel getDefaultPanel() { 
    if(defaultPanel == null){ 
     defaultPanel = new JPanel(); 
    } 
    return defaultPanel; 
} 

private JPanel getManualPanel() { 
    if(manualPanel == null){ 
     manualPanel = new JPanel(); 
     manualPanel.setLayout(new FlowLayout()); 

     manualEntryField = new JTextField(10); 
     manualEntryField.setText("Enter code"); 

     manualAssignButton = new JButton("Assign"); 
     manualAssignButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
      // Here is the exception 
      System.out.println(manualEntryField.getText().trim()); 
      } 
     }); 

     manualLabel = new JLabel("Please enter a code and press assign"); 

     manualPanel.add(manualEntryField); 
     manualPanel.add(manualAssignButton); 
     manualPanel.add(manualLabel); 

    } 
    return manualPanel; 
} 

private JPanel getUploadPanel() { 
    if(uploadPanel == null){ 
     uploadPanel = new JPanel(); 
    } 
    return uploadPanel; 
} 

private void closeApplication() { 
    System.exit(0); 
} 
} 
+1

を、あなたは問題を示して短いものの、完全なプログラムを投稿することができますか? –

+0

いつ何か例外がありますか?ボタンを押すと? – gprathour

+1

コードに入力ミスがあります。ボタンは 'manualButton'として宣言され、' manualAssignButton'として割り当てられます。また、あなたのコードを試してみましたが、それは私に例外を与えません。 –

答えて

3

SSCCEを見て、インスタンス化された冗長Testをコメントアウトし、コンストラクタにパネル配列を作成します。例えば。

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class Test{ 

//public static final Test application = new Test(); 
private JFrame jFrame = null; 
private JPanel jContentPane = null, buttonsPanel = null, cardPanel = null, manualPanel = null, uploadPanel = null, 
     defaultPanel = null; 
private JPanel[] mainPanel = new JPanel[3]; 
private JButton manualButton = null, uploadButton = null, manualAssignButton = null; 
private JTextField manualEntryField = null; 
private JLabel manualLabel = null; 

final static String DEFAULTPANEL = "Default"; 
final static String MANUALPANEL = "Manual"; 
final static String UPLOADPANEL = "Upload"; 

Test() { 
    mainPanel[0] = getDefaultPanel(); 
    mainPanel[1] = getManualPanel(); 
    mainPanel[2] = getUploadPanel(); 
} 

/** 
* Main method 
* @param args 
*/ 
public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      new Test().getJFrame().setVisible(true); 
     } 
    }); 
} 

/** 
* Get the main application frame 
* @return JFrame 
*/ 
private JFrame getJFrame() { 
    if (jFrame == null) { 
     jFrame = new JFrame(); 
     jFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
     jFrame.setResizable(false); 
     // Add the main content pane 
     jFrame.setContentPane(getJContentPanel()); 
     jFrame.addWindowListener(new java.awt.event.WindowAdapter() { 
      public void windowClosing(java.awt.event.WindowEvent e) { 
       closeApplication(); 
      } 
     }); 
    } 
    jFrame.pack(); 
    jFrame.setLocationRelativeTo(null); 
    return jFrame; 
} 

/** 
* Get main content 
* @return JPanel 
*/ 
private JPanel getJContentPanel(){ 
    if (jContentPane == null) { 
     jContentPane = new JPanel(); 
     jContentPane.setPreferredSize(new Dimension(500, 200)); 
     jContentPane.setLayout(new BorderLayout()); 
     jContentPane.add(getButtonsPanel(), BorderLayout.NORTH); 
     jContentPane.add(getCardPanel(), BorderLayout.CENTER); 
    } 
    return jContentPane; 
} 

private JPanel getButtonsPanel() { 
    if(buttonsPanel == null){ 
     buttonsPanel = new JPanel(); 
     buttonsPanel.setPreferredSize(new Dimension(500, 50)); 
     buttonsPanel.setBorder(BorderFactory.createLineBorder(Color.gray)); 

     manualButton = new JButton("Enter manually"); 
     manualButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       CardLayout cl = (CardLayout)(cardPanel.getLayout()); 
       cl.show(cardPanel, MANUALPANEL); 
      } 
     }); 

     uploadButton = new JButton("Upload file"); 
     uploadButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       CardLayout cl = (CardLayout)(cardPanel.getLayout()); 
       cl.show(cardPanel, UPLOADPANEL); 
      } 
     }); 

     buttonsPanel.add(manualButton); 
     buttonsPanel.add(uploadButton); 
    } 
    return buttonsPanel; 
} 

private JPanel getCardPanel() { 
    if(cardPanel == null){ 
     cardPanel = new JPanel(new CardLayout()); 
     cardPanel.setPreferredSize(new Dimension(500, 200)); 
     cardPanel.setBorder(BorderFactory.createLineBorder(Color.gray)); 
     cardPanel.add(mainPanel[0], DEFAULTPANEL); 
     cardPanel.add(mainPanel[1], MANUALPANEL); 
     cardPanel.add(mainPanel[2], UPLOADPANEL); 
    } 
    return cardPanel; 
} 

private JPanel getDefaultPanel() { 
    if(defaultPanel == null){ 
     defaultPanel = new JPanel(); 
    } 
    return defaultPanel; 
} 

private JPanel getManualPanel() { 
    if(manualPanel == null){ 
     manualPanel = new JPanel(); 
     manualPanel.setLayout(new FlowLayout()); 

     manualEntryField = new JTextField(10); 
     System.out.println("creating text field"); 
     manualEntryField.setText("Enter code"); 

     manualAssignButton = new JButton("Assign"); 
     manualAssignButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
      // Here is the exception 
      System.out.println(manualEntryField); 
      System.out.println(manualEntryField.getText()); 
      System.out.println(manualEntryField.getText().trim()); 
      } 
     }); 

     manualLabel = new JLabel("Please enter a code and press assign"); 

     manualPanel.add(manualEntryField); 
     manualPanel.add(manualAssignButton); 
     manualPanel.add(manualLabel); 

    } 
    return manualPanel; 
} 

private JPanel getUploadPanel() { 
    if(uploadPanel == null){ 
     uploadPanel = new JPanel(); 
    } 
    return uploadPanel; 
} 

private void closeApplication() { 
    System.exit(0); 
} 
} 

注:変更がNPEを解決した理由を説明することはできません。「疑わしい」コードをリファクタリングしただけです。

+0

非常にいいスレッド、投稿用に+1 SSCCE – mKorbel

+0

あなたの助けてくれてありがとうが、私のプログラムのstilにそれを貼り付けても、同じエラーが発生します。 – SelketDaly

+0

@SelketDalyと、すべての変数が初期化されているかどうかをチェックする前に、NPEを生成した行でコードをデバッグするようにする前に、いくつかの異なるコードを投稿しました。 – mKorbel

-2

を示し、それがこの例外のが普通です。 (getText()。size()<)条件を使用するか、try-catchを使用し、例外をキャッチしたときに値ではないサイズの文字列 ""を設定してください。

+0

ボックスに入力したときだけでなく、ボックスが空のときにも発生します。 – SelketDaly

-2

テキストボックスが空のときにボタンをクリックしていますか?そうであれば、trim()関数を呼び出すときにその例外が発生することがあるので、trim()を呼び出す前にgetText()が返すものを参照してください。

+1

テキストボックスが空でもNPEを投げません。 –

+0

テキストがない場合、getTextはnullを返しません。空のStringを返します。 – DaveJohnston

2

私はNullPointerExceptionが発生に関連するクエリを解決しました:

問題は、あなたのクラス変数を宣言するということで:

JTextField manualEntryField = null; 

を書くだけで:

private JTextField manualEntryField; 

だけで、そのヌルものを削除それに対してコードの残りの部分は問題ありません。なぜ起こったのかは言えませんが、誰か他人ができるかもしれません。ここで

だけその変化とあなたのコードで、今これを試してください:

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 

public class Test{ 

public static final Test application = new Test(); 
    private JFrame jFrame = null; 
    private JPanel jContentPane = null, buttonsPanel = null, cardPanel = null, manualPanel = null, uploadPanel = null, defaultPanel = null; 
    private JPanel[] mainPanel = {getDefaultPanel(), getManualPanel(), getUploadPanel()}; 
    private JButton manualButton = null, uploadButton = null, manualAssignButton = null; 
    private JTextField manualEntryField; 
    private JLabel manualLabel = null; 

    final static String DEFAULTPANEL = "Default"; 
    final static String MANUALPANEL = "Manual"; 
    final static String UPLOADPANEL = "Upload"; 

    /** 
    * Main method 
    * @param args 
    */ 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       application.getJFrame().setVisible(true); 
      } 
     }); 
    } 

    /** 
    * Get the main application frame 
    * @return JFrame 
    */ 
    private JFrame getJFrame() { 
     if (jFrame == null) { 
      jFrame = new JFrame(); 
      jFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
      jFrame.setResizable(false); 
      // Add the main content pane 
      jFrame.setContentPane(getJContentPanel()); 
      jFrame.addWindowListener(new java.awt.event.WindowAdapter() { 
       public void windowClosing(java.awt.event.WindowEvent e) {  
        closeApplication(); 
       } 
      }); 
     } 
     jFrame.pack(); 
     jFrame.setLocationRelativeTo(null); 
     return jFrame; 
    } 

    /** 
    * Get main content 
    * @return JPanel 
    */ 
    private JPanel getJContentPanel(){ 
     if (jContentPane == null) { 
      jContentPane = new JPanel(); 
      jContentPane.setPreferredSize(new Dimension(500, 200)); 
      jContentPane.setLayout(new BorderLayout()); 
      jContentPane.add(getButtonsPanel(), BorderLayout.NORTH); 
      jContentPane.add(getCardPanel(), BorderLayout.CENTER); 
     } 
     return jContentPane; 
    } 

    private JPanel getButtonsPanel() { 
     if(buttonsPanel == null){ 
      buttonsPanel = new JPanel(); 
      buttonsPanel.setPreferredSize(new Dimension(500, 50)); 
      buttonsPanel.setBorder(BorderFactory.createLineBorder(Color.gray)); 

      manualButton = new JButton("Enter manually"); 
      manualButton.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        CardLayout cl = (CardLayout)(cardPanel.getLayout()); 
        cl.show(cardPanel, MANUALPANEL); 
       } 
      }); 

      uploadButton = new JButton("Upload file"); 
      uploadButton.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        CardLayout cl = (CardLayout)(cardPanel.getLayout()); 
        cl.show(cardPanel, UPLOADPANEL); 
       } 
      }); 

      buttonsPanel.add(manualButton); 
      buttonsPanel.add(uploadButton); 
     } 
     return buttonsPanel; 
    } 

    private JPanel getCardPanel() { 
     if(cardPanel == null){ 
      cardPanel = new JPanel(new CardLayout()); 
      cardPanel.setPreferredSize(new Dimension(500, 200)); 
      cardPanel.setBorder(BorderFactory.createLineBorder(Color.gray)); 
      cardPanel.add(mainPanel[0], DEFAULTPANEL); 
      cardPanel.add(mainPanel[1], MANUALPANEL); 
      cardPanel.add(mainPanel[2], UPLOADPANEL); 
     } 
     return cardPanel; 
    } 

    private JPanel getDefaultPanel() { 
     if(defaultPanel == null){ 
      defaultPanel = new JPanel(); 
     } 
     return defaultPanel; 
    } 

    private JPanel getManualPanel() { 
     if(manualPanel == null){ 
      manualPanel = new JPanel(); 
      manualPanel.setLayout(new FlowLayout()); 

      manualEntryField = new JTextField(10); 
      manualEntryField.setText("Enter code"); 

      manualAssignButton = new JButton("Assign"); 
      manualAssignButton.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
       // Here is the exception 
        System.out.println(manualEntryField.getText().trim()); 
       } 
      }); 

      manualLabel = new JLabel("Please enter a code and press assign"); 

      manualPanel.add(manualEntryField); 
      manualPanel.add(manualAssignButton); 
      manualPanel.add(manualLabel); 

     } 
     return manualPanel; 
    } 

    private JPanel getUploadPanel() { 
     if(uploadPanel == null){ 
      uploadPanel = new JPanel(); 
     } 
     return uploadPanel; 
    } 

    private void closeApplication() { 
     System.exit(0); 
    } 
} 

よろしく

+0

ありがとう、しかし、私はまだエラーを取得しています! – SelketDaly

+0

@SelketDaly:nullを取り除き、単純に正しいプライベートJTextField manualEntryField;そのエラーは消えました:-)よろしくお願いします。 –

+0

良いデバッガ、ここに別のコードを投稿することができます:-) +1 – mKorbel

関連する問題