2012-01-31 3 views
2

텍스트 필드에서 텍스트를 가져 오려고하지만 프로그램을 실행할 때마다 NullPointerException이 발생합니다. 인터넷에서 발견 한 비슷한 문제는 텍스트 필드가 로컬 변수로 다시 선언되는 것과 관련이 있습니다. 그러나 여기에서 내가 그렇게하고있는 것을 볼 수는 없습니다.getText()가있는 NullPointerException

오류 : 지정된 라인에서

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

.

이 짧은 프로그램은 문제

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를 살펴본 결과 NPE 인스턴스화 된 중복 Test을 주석 처리하고 생성자에 패널 배열을 생성합니다. E.G.

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() <) 1) 조건을 사용하거나 try-catch를 사용하고 예외를 catch하면 비 크기 문자열 "" "을 설정하십시오. 을 시도하십시오.

+0

상자에 입력했을 때뿐만 아니라 상자가 비어있을 때도 발생합니다. – SelketDaly

-2

텍스트 상자가 비어있을 때 버튼을 클릭하고 있습니까? 그렇다면 trim() 함수를 호출 할 때 해당 예외가 발생할 수 있으므로 trim()을 호출하기 전에 getText()가 반환하는 내용을 확인하십시오.

+1

텍스트 상자가 비어 있어도 NPE가 나오지 않습니다. –

+0

텍스트가없는 경우 getText는 null을 반환하지 않고 빈 문자열을 반환합니다. – DaveJohnston

2

내가 NullPointerException이 관련 검색어를 해결 않았다

문제는 클래스 변수를 선언하는 것이되고 :

JTextField manualEntryField = null; 

그냥 쓰기 :

private JTextField manualEntryField; 

그냥 널 (null) 일을 제거, 그것에 대해 코드의 나머지 부분은 괜찮습니다. 왜 그런 일이 일어 났는지 말할 수는 없지만 다른 사람이 그럴 수도 있습니다. 여기

은 해당 변화 코드는, 지금이 밖으로 시도 할됩니다 :

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