2013-10-18 44 views
1

當我運行這個項目時,我得到一個NullPointer。運行類中的空指針

"Exception in thread "main" java.lang.NullPointerException 
    at movieinfo.Swinggui.gui(Swinggui.java:71) 
    at movieinfo.Swinggui.main(Swinggui.java:38) 
" 

它似乎沒有在這兩行上,我正在訪問尚未聲明。 我試圖設置斷點和調試來解決它自己,無濟於事。 感謝您的幫助,我真的不是要求spoon。。

package movieinfo; 

import java.awt.Color; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.List; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.io.IOException; 
import java.nio.charset.Charset; 
import java.util.ArrayList; 
import java.util.Map; 
import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 

import org.apache.commons.io.FileUtils; 

import com.json.parsers.JSONParser; 
import com.json.parsers.JsonParserFactory; 


public class Swinggui { 
    private static JButton enter; 
    private static JTextField movietext; 
    private static JTextArea movieinfo; 
    private static JList listofmovies;//converts moviestowatch into gui element. 
    private static File textfilemovie; //file which movies marked for watching are saved 
    private static java.util.List<String> moviestowatch; //arraylist which is populated by textfilemovie than printed to GUI element. 
    public static void main(String[] args) throws IOException 
    { 
yourMovies(); 
     gui(); 
     json(); 



    } 
    public static void gui() 
    { 
     JFrame maingui = new JFrame("Gui"); 
     maingui.setLayout(new GridBagLayout()); 
     GridBagConstraints c = new GridBagConstraints(); 
     c.fill = GridBagConstraints.VERTICAL; 
     enter = new JButton("Enter"); 
     c.gridx = 2; 
     c.gridy = 1; 
     maingui.add(enter, c); 
     movieinfo = new JTextArea(5,20); 
     movieinfo.setBorder(BorderFactory.createMatteBorder(2,2,2,2,Color.red)); 
     movietext = new JTextField(18); 
     c.gridx = 1; 
     c.gridy = 1; 
     maingui.add(movietext, c); 
     final JScrollPane scrolll = new JScrollPane(movieinfo); 
     c.gridx = 1; 
     c.gridy = 3; 
     c.gridwidth = 2; 
     maingui.add(scrolll, c); 
     final JLabel titlee = new JLabel("Enter movie name below!"); 
     c.gridx = 1; 
     c.gridy = 0; 
     maingui.add(titlee, c); 
     maingui.setResizable(false); 
     maingui.setVisible(true); 
     listofmovies = new JList(moviestowatch.toArray()); 
     c.gridx = 4; 
     c.gridy = 3; 
     maingui.add(new JScrollPane(listofmovies), c); 
     movieinfo.setLineWrap(true); 
     movieinfo.setWrapStyleWord(true); 
     movieinfo.setEditable(false); 
     scrolll.getPreferredSize(); 
     //pangui.setPreferredSize(new Dimension(300, 150)); 
     //pangui.add(scrolll, BorderLayout.CENTER); 
     //movieinfo.add(scrolll); 
     maingui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     maingui.pack(); 

    } 
    public static void json() 
    { 
     enter.addActionListener(new ActionListener(){ 

      private JsonParserFactory factory; 
      private JSONParser parser; 
      @SuppressWarnings("rawtypes") 
      private Map jsonData; 

      public void actionPerformed(ActionEvent e) 
      { 
       System.out.println(apicall.getMovieInfo(movietext.getText())); 
       factory = JsonParserFactory.getInstance(); 
       parser = factory.newJsonParser(); 
       jsonData = parser.parseJson(apicall.getMovieInfo(movietext.getText())); 
       String Title = (String)jsonData.get("Title"); 
       String Year = (String)jsonData.get("Year"); 
       String Plot = (String)jsonData.get("Plot"); 
       movieinfo.setText("Title: "+Title+"\nYear: "+ Year +"\nPlot: "+Plot); 
      } 
     }); 
    } 
    public static void yourMovies() throws IOException 
    { 
     textfilemovie = new File(org.apache.commons.io.FileUtils.getUserDirectory() + "/yourmovies.txt"); 

     textfilemovie.createNewFile(); 
     moviestowatch = FileUtils.readLines(textfilemovie); 
     while (listofmovies.getSelectedValue().toString()!= null) 
     { 
      movietext.setText(listofmovies.getSelectedValue().toString()); 
      enter.doClick(); 
     } 

    } 
} 
+3

哪一行是Swinggui.java類的71?這就是你試圖去引用(通常是調用一個方法)一個帶有空引用的變量的地方。 –

+0

listofmovies = new JList(moviestowatch.toArray());是71行。 –

+3

'moviestowatch'爲null。現在回頭看看爲什麼。 –

回答

9

你打電話給gui()之前調用yourMovies()所以不要在使用它之前初始化ArrayList。

但是,這不是什麼重要的。不,最重要的是你認識的如何調試NPE在自己的過程:

  • 檢查拋出NPE
  • 發現是空
  • 然後在該行的變量的行重新搜索代碼,看看爲什麼當你認爲它不應該是null時。

通常這些錯誤很容易修復,一旦你知道如何。

你的其他問題包括:

  • 您使用過靜態的。您的代碼沒有「狀態」,沒有真正的OOP類,這會限制您擴展和改進代碼的能力。唯一的靜態方法應該是主要方法,並且這應該只包含用於設置類和啓動它們的代碼,就是這樣。
  • 你的json代碼應該在它自己的類中,與GUI類分開。這將允許您從完全不相關的代碼中進行調試和增強。查找內聚和耦合。你希望你的班級凝聚力高,耦合度低:保持相關的東西在一起,不相干的東西分開。
  • 您的while循環,while (listofmovies.getSelectedValue().toString()!= null)...在當前位置沒有意義。在GUI的按鈕處於創建,構建過程以及呈現之前,您不應該在GUI按鈕上調用doClick()
  • 你的代碼被扔在一起,沒有計劃。在提交任何代碼之前,最好先在紙上寫出程序的結構。
+0

我看到了。我試圖回溯以擺脫空指針,並在修復它之前意外地發佈了此代碼。 –

+0

我收到同樣的空指針@線路115,而(!listofmovies.getSelectedValue()的toString()= NULL) \t \t { \t \t \t movietext.setText(listofmovies.getSelectedValue()的toString()); \t \t \t enter.doClick(); \t \t} –

+0

@EricLang:見編輯回答。你的while循環的內容是有問題的。 –

2

您的moviestowatch未初始化。

您正在致電yourMovies()來初始化moviestowatch

但是您正在嘗試訪問gui()中的moviestowatch

2

你已經在第35行

private static java.util.List<String> moviestowatch; //arraylist which is populated by textfilemovie than printed to GUI element. 

宣佈moviestowatch和功能GUI()

listofmovies = new JList(moviestowatch.toArray()); 

使用前初始化它用它的71行。

調用函數的順序是

gui(); 
    json(); 
    yourMovies(); 

您的列表中yourMovies初始化()method.and你使用它的GUI()方法。所以在調用實際使用它的gui()方法之前調用yourMovies()方法。

編輯:

你的下一個錯誤是得到一個空指針@線115在下面的while循環。

要解決上述錯誤,你所做的是改變序列並在gui()之前調用yourMovies()。但是在這裏你已經在gui中初始化了listofmovies列表,並在yourMovies()方法中使用:)。

這是一般的編程習慣,對於所有列表/對象,您必須在每次使用之前手動檢查它。它在使用之前應該被初始化。否則會拋出NPE。

+0

我已經修復了這個錯誤,我在下面的while循環中得到了一個nullpointer @行115。 –

+0

而(listofmovies.getSelectedValue()的toString()= NULL!) \t \t { \t \t \t movietext.setText(listofmovies.getSelectedValue()的toString()); \t \t \t enter.doClick(); \t \t} –

+0

你所做的是改變了調用函數的順序? –

3

這似乎並不在這兩條線,我訪問那些尚未 被宣佈。

相信JVM。如果它說在那條線上有一個NPE,那麼這是真的。你的「似乎」是一個不好的假設。

我試圖設置斷點和調試來自己修復它,到沒有 有效。

聽起來像您需要了解如何在您的IDE中設置斷點。如果你做得對,這將很快整理出來。你在使用哪一個?

感謝您的幫助,我真的不是要求spoon。。

不幸的是,你要求spooned。

+0

我實際上已經發現了我的構造函數的問題,我認爲我已經在我發佈的代碼中修復了它,但是我沒有。 我怎麼要求被spoonfed,我毫不誇張地看到沒有錯「,而(listofmovies.getSelectedValue()。的toString()!= NULL) \t \t { \t \t \t movietext.setText(listofmovies.getSelectedValue()。的toString()); \t \t \t enter.doClick(); \t \t} 「 –

+0

你應該習慣推遲到虛擬機時,它說一個指針爲空。當你看到沒有錯誤的代碼沒有錯誤時,你有一些東西需要了解你的代碼。 – matthudson

-2

如果你得到NullPointerException,它總是意味着你的一個類字段沒有被初始化。你不可能用局部參考變量獲得NPE,因爲編譯器會警告你。我自己嘗試初始化所有不需要額外輸入的內容,而這種做法爲我節省了大量的NPE。這對容器尤其有用。

+0

''你不可能用本地引用變量獲得NPE,因爲編譯器會警告你。「 - 這根本不是真的。是的,在使用它之前,您必須始終分配一個局部變量,但該分配可能爲空。 –

+0

是的,你說得對,我的這句話是不明確的,因爲它缺少一個單詞'decklaration'。它應該按照以下方式組成:您無法使用本地參考變量聲明(不要與定義混淆)獲取NPE,因爲編譯器僅禁止該聲明。任何局部變量都必須初始化(使用Java),並且可以將局部引用變量設置爲null,然後可以讓NPE嘗試調用該變量上的方法。 – Luke