2017-02-21 9 views
-1

Итак, у меня есть программа, которую я пишу, чтобы позволить пользователю вводить текстовые значения для атрибутов класса «Роман» и «Журнал», которые я разработал, однако у меня возникла проблема с моим средством actionListener, где он дает мне исключение с нулевым указателем всякий раз, когда я запускаю действие. Я думаю, это что-то делать со мной имея в Заявлении переключательJButton actionPerformed метод, предоставляющий Null

switch(theList.getSelectedIndex()){ 
       case -1: JOptionPane.showMessageDialog(null, "You did not select an object type to create!", "Error!", JOptionPane.ERROR_MESSAGE); 
         break; 
       case 0: createObject(theMagazine, titleField, authorField, publisherField, publisherLocationField, copyrightYearField, priceEnterField, ISBNEnterField); 
         JOptionPane.showMessageDialog(null, theMagazine.toString(), "This is The Magazine You Created!", JOptionPane.INFORMATION_MESSAGE); 
         break; 
       case 1: createObject(theNovel, titleField, authorField, publisherField, publisherLocationField, copyrightYearField, priceEnterField, ISBNEnterField); 
         theNovel.setHardCover(Boolean.parseBoolean(JOptionPane.showInputDialog(null,"Is this Book a hard cover or not?","Question!",JOptionPane.QUESTION_MESSAGE))); 
         JOptionPane.showMessageDialog(null, theNovel.toString(), "This is The Magazine You Created!", JOptionPane.INFORMATION_MESSAGE); 
         break; 
      } 

По сути то, что я хочу, чтобы это сделать, это быть в состоянии вызвать метод CreateObject() для соответствующих значений атрибутов, а затем показать диалоговое окно сообщений в JOptionPane в для объекта, созданного с помощью метода toString(), содержащегося в обоих этих классах. Я знаю, что проблема не вытекает из синтаксиса метода из любого из этих классов, поэтому я не всегда понимаю, с чего это происходит.

Это исходный код:

import javax.swing.*; 
import javax.swing.border.*; 
import java.awt.event.*; 
import java.awt.*; 
@SuppressWarnings({"serial"}) 
public class GUI extends JFrame{ 

static Magazine theMagazine; 
static Novel theNovel; 

public static void main(String[] args){ 
    final String[] objectTypes = {"Magazine","Novel"}; 
    final Border textFieldBorder = BorderFactory.createLineBorder(Color.black, 1); 
    final Font theFont = new Font("Times New Roman", 0, 25); 
    final JLabel typeSelect = new JLabel("Please select the literature type!"); 
    final JLabel titleEnter = new JLabel("Enter the title here!"); 
    final JLabel authorEnter = new JLabel("Enter the Author here!"); 
    final JLabel publisherEnter = new JLabel("Enter the publisher here!"); 
    final JLabel pubLocationEnter = new JLabel("Enter the Publishers location here"); 
    final JLabel enterCopyrightYear = new JLabel("Enter the copyright year here!"); 
    final JLabel priceEnter = new JLabel("Enter the price here!"); 
    final JLabel ISBNEnter = new JLabel("Enter the ISBN here!");  

    JList<String> theList = new JList<String>(objectTypes); 
    theList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    theList.setLayoutOrientation(JList.HORIZONTAL_WRAP); 
    theList.setVisibleRowCount(-1); 
    theList.setBorder(textFieldBorder); 
    theList.setFont(theFont); 

    JTextField titleField = new JTextField(); 
    titleField.setBorder(textFieldBorder); 
    titleField.setFont(theFont); 
    titleField.setHorizontalAlignment(JTextField.CENTER); 
    JTextField authorField = new JTextField(); 
    authorField.setBorder(textFieldBorder); 
    authorField.setFont(theFont); 
    authorField.setHorizontalAlignment(JTextField.CENTER); 
    JTextField publisherField = new JTextField(); 
    publisherField.setBorder(textFieldBorder); 
    publisherField.setFont(theFont); 
    publisherField.setHorizontalAlignment(JTextField.CENTER); 
    JTextField publisherLocationField = new JTextField(); 
    publisherLocationField.setBorder(textFieldBorder); 
    publisherLocationField.setFont(theFont); 
    publisherLocationField.setHorizontalAlignment(JTextField.CENTER); 
    JTextField copyrightYearField = new JTextField(); 
    copyrightYearField.setBorder(textFieldBorder); 
    copyrightYearField.setFont(theFont); 
    copyrightYearField.setHorizontalAlignment(JTextField.CENTER); 
    JTextField priceEnterField = new JTextField(); 
    priceEnterField.setBorder(textFieldBorder); 
    priceEnterField.setFont(theFont); 
    priceEnterField.setHorizontalAlignment(JTextField.CENTER); 
    JTextField ISBNEnterField = new JTextField(); 
    ISBNEnterField.setBorder(textFieldBorder); 
    ISBNEnterField.setFont(theFont); 
    ISBNEnterField.setHorizontalAlignment(JTextField.CENTER); 

    JButton createObject = new JButton("Create an Object!"); 
    createObject.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent event){ 
      switch(theList.getSelectedIndex()){ 
       case -1: JOptionPane.showMessageDialog(null, "You did not select an object type to create!", "Error!", JOptionPane.ERROR_MESSAGE); 
         break; 
       case 0: createObject(theMagazine, titleField, authorField, publisherField, publisherLocationField, copyrightYearField, priceEnterField, ISBNEnterField); 
         JOptionPane.showMessageDialog(null, theMagazine.toString(), "This is The Magazine You Created!", JOptionPane.INFORMATION_MESSAGE); 
         break; 
       case 1: createObject(theNovel, titleField, authorField, publisherField, publisherLocationField, copyrightYearField, priceEnterField, ISBNEnterField); 
         theNovel.setHardCover(Boolean.parseBoolean(JOptionPane.showInputDialog(null,"Is this Book a hard cover or not?","Question!",JOptionPane.QUESTION_MESSAGE))); 
         JOptionPane.showMessageDialog(null, theNovel.toString(), "This is The Magazine You Created!", JOptionPane.INFORMATION_MESSAGE); 
         break; 
      } 
     } 
    }); 
    JButton closeProgram = new JButton("Close the program!"); 
    closeProgram.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent event){ 
      System.exit(0); 
     } 
    }); 

    JPanel thePanel = new JPanel(); 
    thePanel.setLayout(new GridLayout(9,2)); 

    JFrame theFrame; 

    //first row 
    thePanel.add(typeSelect); 
    thePanel.add(theList); 

    //second row 
    thePanel.add(titleEnter); 
    thePanel.add(titleField); 

    //third row 
    thePanel.add(authorEnter); 
    thePanel.add(authorField); 

    //fourth row 
    thePanel.add(publisherEnter); 
    thePanel.add(publisherField); 

    //fifth row 
    thePanel.add(pubLocationEnter); 
    thePanel.add(publisherLocationField); 

    //sixth row 
    thePanel.add(enterCopyrightYear); 
    thePanel.add(copyrightYearField); 

    //seventh row 
    thePanel.add(priceEnter); 
    thePanel.add(priceEnterField); 

    //eighth row 
    thePanel.add(ISBNEnter); 
    thePanel.add(ISBNEnterField); 

    //ninth row 
    thePanel.add(createObject); 
    thePanel.add(closeProgram); 

    theFrame = new JFrame(); 
    theFrame.add(thePanel); 
    theFrame.setTitle("Literature Creator!"); 
    theFrame.setSize(500,500); 
    theFrame.setVisible(true); 
    theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    theFrame.setResizable(false); 

} 
public static void createObject(Literature theLiterature, JTextField titleField, JTextField authorField, JTextField publisherField, JTextField publisherLocationField, 
         JTextField copyrightYearField, JTextField priceEnterField, JTextField ISBNEnterField){ 
    theLiterature.setTitle(parseField(titleField)); 
    theLiterature.setAuthor(parseField(authorField)); 
    theLiterature.setPublisher(parseField(publisherField)); 
    theLiterature.setPublisherLocation(parseField(publisherLocationField)); 
    theLiterature.setCopyrightYear(parseNumField(copyrightYearField)); 
    theLiterature.setPrice(parseNumField(priceEnterField)); 
    theLiterature.setISBN(parseNumField(ISBNEnterField)); 
} 
public static String parseField(JTextField field){ 
    if(field.getText() == null){ 
     JOptionPane.showMessageDialog(null, "Error! " + field.getName() + " contains no text!", "Error", JOptionPane.ERROR_MESSAGE); 
     System.exit(0); 
    } 
    return field.getText(); 
} 
public static int parseNumField(JTextField field){ 
    if(field.getText() == null){ 
     JOptionPane.showMessageDialog(null, "Error! " + field.getName() + " contains no text!", "Error", JOptionPane.ERROR_MESSAGE); 
     System.exit(0); 
    } 
    try{ 
     Integer.parseInt(field.getText()); 
    }catch(NumberFormatException nfe){ 
     JOptionPane.showMessageDialog(null, "Error! Value in field " + field.getName() + " was not a valid number!", "Error!", JOptionPane.ERROR_MESSAGE); 
     System.exit(0); 
    } 
    return Integer.parseInt(field.getText()); 
} 

}

Вот текст из сообщения об ошибке: http://pastebin.com/HRi9jbSD

Любая помощь очень ценится!

+1

Итак, где вы устанавливаете 'theMagazine' как ничто иное, как null? –

+0

@DM hahahahaha было бы похоже, что я сделал это нигде ... Упс, глупая ошибка, я думаю, но это был долгий длинный день. Спасибо! –

ответ

0

По умолчанию Java присваивает null новой заданной переменной. Эта статическая переменная

static Magazine theMagazine; 

равна нулю, когда вы передаете его в метод createObject(...).

Вам необходимо создать новый объект Magazine (или загрузить его как-то) и назначить его переменной theMagazine.

+0

спасибо! Я понимаю это сейчас. Я знал о нулевом значении по умолчанию, но это был довольно долгий день, поэтому после большого сканирования я все еще не видел, что это может быть проблемой, так как мой мозг не регенерировал его. Приветствия! –

Смежные вопросы