7

Здравствуйте, я новый программист на уровне средней школы, в результате я мало знаю о программировании и получаю довольно много ошибок, которые имеют были решены, а другие я совершенно не понимаю. Я должен сделать простую программу выбора Check Box, где пользователь может выбирать между различными вариантами выбора и в зависимости от их действия изображение меняется. Сама программа прекрасно компилируется, но когда я запускаю ее, это дает мне некоторые осложнения. Вот моя программа:Исключение из потока «AWT-EventQueue-0» java.lang.NullPointerException Error

package components; 

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

public class Workshop extends JPanel 
         implements ItemListener { 
JCheckBox winterhatButton; 
JCheckBox sportshatButton; 
JCheckBox santahatButton; 
JCheckBox redshirtButton; 
JCheckBox brownshirtButton; 
JCheckBox suitButton; 
JCheckBox denimjeansButton; 
JCheckBox blackpantsButton; 
JCheckBox khakipantsButton; 


    StringBuffer choices; 
JLabel pictureLabel; 

public Workshop() { 
    super(new BorderLayout()); 

    //Create the check boxes. 
    winterhatButton = new JCheckBox("Winter Hat"); 
    winterhatButton.setMnemonic(KeyEvent.VK_Q); 


    sportshatButton = new JCheckBox("Sports Hat"); 
    sportshatButton.setMnemonic(KeyEvent.VK_W); 


    santahatButton = new JCheckBox("Santa hat"); 
    santahatButton.setMnemonic(KeyEvent.VK_E); 


    redshirtButton = new JCheckBox("Red Shirt"); 
    redshirtButton.setMnemonic(KeyEvent.VK_R); 


    brownshirtButton = new JCheckBox("Brown Shirt"); 
    brownshirtButton.setMnemonic(KeyEvent.VK_T); 


    suitButton = new JCheckBox("Suit"); 
    suitButton.setMnemonic(KeyEvent.VK_Y); 


    suitButton = new JCheckBox("Denim Jeans"); 
    suitButton.setMnemonic(KeyEvent.VK_U); 


    blackpantsButton = new JCheckBox("Black Pants"); 
    blackpantsButton.setMnemonic(KeyEvent.VK_I); 


    khakipantsButton = new JCheckBox("Khaki Pants"); 
    khakipantsButton.setMnemonic(KeyEvent.VK_O); 



    //Register a listener for the check boxes. 

    winterhatButton.addItemListener(this); 
    sportshatButton.addItemListener(this); 
    santahatButton.addItemListener(this); 
    redshirtButton.addItemListener(this); 
    brownshirtButton.addItemListener(this); 
    suitButton.addItemListener(this); 
    denimjeansButton.addItemListener(this); 
    blackpantsButton.addItemListener(this); 
    khakipantsButton.addItemListener(this); 


    //Indicates 
    choices = new StringBuffer("---------"); 


    //Set up the picture label 
    pictureLabel = new JLabel(); 
    pictureLabel.setFont(pictureLabel.getFont().deriveFont(Font.ITALIC)); 
    updatePicture(); 

    //Put the check boxes in a column in a panel 
    JPanel checkPanel = new JPanel(new GridLayout(0, 1)); 
    checkPanel.add(winterhatButton); 
    checkPanel.add(sportshatButton); 
    checkPanel.add(santahatButton); 
    checkPanel.add(redshirtButton); 
    checkPanel.add(brownshirtButton); 
    checkPanel.add(suitButton); 
    checkPanel.add(denimjeansButton); 
    checkPanel.add(blackpantsButton); 
    checkPanel.add(khakipantsButton); 


    add(checkPanel, BorderLayout.LINE_START); 
    add(pictureLabel, BorderLayout.CENTER); 
    setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); 
} 


    /** Listens to the check boxes. */ 
public void itemStateChanged(ItemEvent e) { 
    int index = 0; 
    char c = '-'; 
    Object source = e.getItemSelectable(); 

    if (source == winterhatButton) { 
     index = 0; 
     c = 'q'; 
    } else if (source == sportshatButton) { 
     index = 1; 
     c = 'w'; 
    } else if (source == santahatButton) { 
     index = 2; 
     c = 'e'; 
    } else if (source == redshirtButton) { 
     index = 3; 
     c = 'r'; 
    } else if (source == brownshirtButton) { 
     index = 4; 
     c = 't'; 
    } else if (source == suitButton) { 
     index = 5; 
     c = 'y'; 
    } else if (source == denimjeansButton) { 
     index = 6; 
     c = 'u'; 
    } else if (source == blackpantsButton) { 
     index = 7; 
     c = 'i'; 
    } else if (source == khakipantsButton) { 
     index = 8; 
     c = 'o'; 
    } 


    if (e.getStateChange() == ItemEvent.DESELECTED) { 
     c = '-'; 
    } 

    //Apply the change to the string. 
    choices.setCharAt(index, c); 

    updatePicture(); 
} 


protected void updatePicture() { 
    //Get the icon corresponding to the image. 
    ImageIcon icon = createImageIcon(
           "images/bear/bear-" 
           + choices.toString() 
           + ".gif"); 
    pictureLabel.setIcon(icon); 
    pictureLabel.setToolTipText(choices.toString()); 
    if (icon == null) { 
     pictureLabel.setText("Missing Image"); 
    } else { 
     pictureLabel.setText(null); 
    } 
} 

/** Returns an ImageIcon, or null if the path was invalid. */ 
protected static ImageIcon createImageIcon(String path) { 
    java.net.URL imgURL = Workshop.class.getResource(path); 
    if (imgURL != null) { 
     return new ImageIcon(imgURL); 
    } else { 
     System.err.println("Couldn't find file: " + path); 
     return null; 
    } 
} 

    private static void createAndShowGUI() { 
    //Create and set up the window. 
    JFrame frame = new JFrame("Build a Bear at Safeer's Workshop!"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    //Create and set up the content pane. 
    JComponent newContentPane = new Workshop(); 
    newContentPane.setOpaque(true); //content panes must be opaque 
    frame.setContentPane(newContentPane); 

    //Display the window. 
    frame.pack(); 
    frame.setVisible(true); 
} 

public static void main(String[] args) { 
    //Schedule a job for the event-dispatching thread: 
    //creating and showing this application's GUI. 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 
} 

Ну до этой части она работает плавно и соответствует, но когда я перехожу запустить программу, которую я получаю эту ошибку.

> run components.Workshop 
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at components.Workshop.<init>(Workshop.java:75) 
at components.Workshop.createAndShowGUI(Workshop.java:195) 
at components.Workshop.access$0(Workshop.java:189) 
at components.Workshop$1.run(Workshop.java:209) 
at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$000(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 

Возможно, это глупая ошибка, но я не могу понять это. Пожалуйста, помогите и спасибо

 Here is the line that generates that error 
    private void jButtonSendActionPerformed(java.awt.event.ActionEvent evt) {             
    // TODO add your handling code here: 
    String message; 
    if(messageBox.getText().length() > 0){ 
     message = messageBox.getText(); 
     chatBox.append(message+"\n"); 
     printStream.println(message);//this line 
     printStream.flush(); 
     //printStream.close(); 
     messageBox.setText(""); 
    } 
} 

ответ

19

NullPointerException S являются одними из самых простых исключений для диагностики, часто. Всякий раз, когда вы получаете исключение в Java и видите трассировку стека (кстати, кстати, ваш второй котировочный блок), вы читаете сверху вниз. Часто вы увидите исключения, которые начинаются в коде библиотеки Java или в методах собственных реализаций, для диагностики вы можете просто пропустить их до тех пор, пока не увидите файл кода, который вы написали.

Тогда вам понравится указанная строка и посмотрите на каждый из объектов (созданных экземплярами классов) на этой строке - один из них не был создан, и вы пытались его использовать. Вы можете начать с поиска в своем коде, чтобы узнать, вызвал ли вы конструктор на этом объекте. Если вы этого не сделали, то это ваша проблема, вам нужно создать экземпляр этого объекта, вызвав новое имя класса (аргументы). Другая частая причина NullPointerException s - это случайное объявление объекта с локальной областью, когда есть переменная экземпляра с тем же именем.

В вашем случае исключение произошло в вашем конструкторе для Workshop в строке 75. <init> означает конструктор для класса. Если вы посмотрите на эту строку в вашем коде, вы увидите строку

denimjeansButton.addItemListener(this); 

Есть довольно четко два объекта на этой линии: denimjeansButton и this. this является синонимом экземпляра класса, в котором вы сейчас находитесь, и вы находитесь в конструкторе, поэтому он не может быть this. denimjeansButton - ваш преступник. Вы никогда не создавали экземпляр этого объекта. Удалите ссылку на переменную экземпляра denimjeansButton или создайте экземпляр.