getter 和 setter 中的 NullPointerException

NullPointerException in getter and setter

编辑: 当我创建一个 TwitterModel 的实例时,不会执行 main 方法然后初始化 statuses 吗?所以我应该在调用 getUsertimeline()?

时得到 statuses 的值

TwitterModel 的主要方法中设置后,我试图在 TwitterPanel 中获取 statuses。但是,我在执行时得到 NullPointerException

for (Status status : tm.getUserTimeline()) {
    twitterFeed1.setText("@" + status.getUser().getScreenName() + " - "
                + status.getText());
}

MainFrame.java

import java.awt.CardLayout;

public class MainFrame extends JFrame {

static CardLayout cardLayout;
static JPanel cards;
static ResponseList<Status> statuses;

public MainFrame() {

    TwitterPanel tp = new TwitterPanel();

    cards = new JPanel();
    cardLayout = new CardLayout();

    cards.setLayout(cardLayout); // Setting JPanel, cards, as CardLayout

    // JFrame settings
    add(cards); // Adding JPanel, cards to JFrame
    // setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS));
    setLayout(new FlowLayout());
    setTitle("Demo");
    setSize(1000, 500);
    setVisible(true);
    setLocationRelativeTo(null);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    cards.add(tp, "tp");
    cardLayout.show(cards, "tp");
}

public static void main(String[] args) throws TwitterException {
    MainFrame asd = new MainFrame();
}

TwitterPanel.java(NPE发生在这里)

import javax.swing.JPanel;

public class TwitterPanel extends JPanel {

// Global variables
static TwitterModel tm = new TwitterModel();

public TwitterPanel() {

    // JPanel layout
    setBorder(new LineBorder(new Color(0, 0, 0)));
    setLayout(null);

    // JLabel
    JLabel twitterLabel = new JLabel("Twitter");
    twitterLabel.setBounds(208, 0, 58, 30);
    add(twitterLabel);

    // JTextArea
    TextArea twitterFeed1 = new TextArea();
    twitterFeed1.setBounds(17, 28, 212, 248);
    add(twitterFeed1);

    for (Status status : tm.getUserTimeline()) {
        twitterFeed1.setText("@" + status.getUser().getScreenName() + " - "
                + status.getText());
    }

    TextArea twitterFeed2 = new TextArea();
    twitterFeed2.setBounds(246, 28, 212, 248);
    add(twitterFeed2);
}

public static void main(String[] args) {}

TwitterModel.java

import twitter4j.Paging;

public class TwitterModel {

static ResponseList<Status> statuses;
static String user;
static Paging count = new Paging(1, 5);
static Twitter twitter;

public TwitterModel() {}

public ResponseList<Status> getUserTimeline() {
    return TwitterModel.statuses;
}

public static void main(String[] args) {
    ConfigurationBuilder cb = new ConfigurationBuilder();
    cb.setDebugEnabled(true)
            .setOAuthConsumerKey(xxx")
            .setOAuthConsumerSecret(
                    "xxx ")
            .setOAuthAccessToken(
                    xxx")
            .setOAuthAccessTokenSecret(
                    "xxx");

    TwitterFactory tf = new TwitterFactory(cb.build());
    twitter = tf.getInstance();

    try {
        if (args.length == 1) {
            user = args[0];
            statuses = twitter.getUserTimeline(user, count);
            Controller con = new Controller();
            con.settingStatus(statuses);
        } else {
            // user = twitter.verifyCredentials().getScreenName();
            user = "Ashton";
            System.out.println("Successful");

            statuses = twitter.getUserTimeline(user, count);
        }
        System.out.println("Showing @" + user + "'s user timeline.");
        for (Status status : statuses) {
            System.out.println("@" + status.getUser().getScreenName()
                    + " - " + status.getText());
        }
    } catch (TwitterException te) {
        te.printStackTrace();
        System.out.println("Failed to get timeline: " + te.getMessage());
        System.exit(-1);
    }
}

main 方法是静态的,在您启动程序时调用。每个程序只有一个主要方法。

public TwitterModel() {}

这是创建实例时调用的构造函数。 尝试将您的主要方法代码放入此处

问题背景:

Twitter 身份验证代码要求 String[] args 参数在执行前存在。但是,在创建上述 class 的实例时,我必须将 args 初始化为 null。因此收到 NullPointerException.

答案:

我相信解决方案是构造函数重载,如下所示。如果我错了请纠正我

MainFrame.java

public class MainFrame extends JFrame{

      public MainFrame(){
         ....
      }
}

public static void Twitter(){
    ... // Twitter's authentication... etc are executed here
}

public static void main(String[] args){
    Twitter();
    ...
}