1

我的问题是我编写了一个登录网站并下载所需数据的程序。一切都很好,程序在突然停止工作时工作。在代码中,没有任何变化,即使程序开始每次都抛出异常。什么可能导致这种情况?我该如何解决?

例外是:

Exception in thread "main" java.lang.NullPointerException at gui.JsoupClass.checkLogin(JsoupClass.java:55) at gui.JsoupClass.<init>(JsoupClass.java:31) at gui.JsoupClass.main(JsoupClass.java:22) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

这是我的代码,也许我看不到你们中的一些人会看到的东西:

package gui;

import dao.*;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import javax.swing.*;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class JsoupClass
{
    static String value[] = new String[3];
    static String name[] = new String[3];

    public static void main(String args[]) {
        new JsoupClass("email@gmail.com", "yourpassword", null);
    }

    public JsoupClass(String emailText, String passText, MainFrame mainFrame) {
        Connection.Response res;

        res = getLoginData();
        res = doLogin(res, emailText, passText);

        if (checkLogin(res).hasText()) {
            setUpTrafficPayment(res);
            setUpEwalletData(res);
            setUpPanelsData(res);
            setUpPaymentData(res);
            try {
                if (mainFrame != null)
                    mainFrame.dispose();
                new StatisticFrame();
            } catch (ParseException e1) {
                e1.printStackTrace();
            }
        } else {
            JOptionPane.showMessageDialog(RunFrame.getInstance(),
                    "Wrong Login Data!",
                    "Warning",
                    JOptionPane.WARNING_MESSAGE);
        }
    }

    public Elements checkLogin(Connection.Response res) {
        Document doc = null;
        Elements elements;
        try {
            doc = res.parse();
        } catch (IOException e) {
            e.printStackTrace();
        }

        elements = doc.select("div#topuserinfo > a > span");
        if (elements.hasText()) {
            UserData userData = UserData.getInstance();
            userData.setNameValue(elements.text());
        }
        return elements;
    }

    public Document getPage(Connection.Response res, String pageAddres) {
        Document doc = null;
        try {
            doc = Jsoup
                    .connect(pageAddres)
                    .cookie("PHPSESSID", res.cookie("PHPSESSID"))
                    .get();
        } catch (SocketTimeoutException e) {
            JOptionPane.showMessageDialog(RunFrame.getInstance(),
                    "Read timed out! Could not open connection to Banners Broker!",
                    "Error",
                    JOptionPane.ERROR_MESSAGE);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return doc;
    }

    public Connection.Response doLogin(Connection.Response res, String email, String pass) {
        Connection.Response res2 = null;
        try {
            res2 = Jsoup
                    .connect("https://bannersbroker.com//user/login?event=doLogin")
                    .cookies(res.cookies())
                    .data("email", email)
                    .data("pass", pass)
                    .data(name[0], value[0])
                    .data(name[1], value[1])
                    .data(name[2], value[2])
                    .method(Connection.Method.POST)
                    .execute();

        } catch (IOException ioe) {
        } catch (IllegalArgumentException ioe) {
            JOptionPane.showMessageDialog(RunFrame.getInstance(),
                    "Could not open connection to Banners Broker!",
                    "Error",
                    JOptionPane.ERROR_MESSAGE);
        } catch (NullPointerException ioe) {
            JOptionPane.showMessageDialog(RunFrame.getInstance(),
                    "Could not open connection to Banners Broker!",
                    "Error",
                    JOptionPane.ERROR_MESSAGE);
        }
        return res2;
    }

    public Connection.Response getLoginData() {
        Connection.Response res = null;
        try {
            String html;
            int length, counter;

            res = Jsoup
                    .connect("https://bannersbroker.com//user/login?event=doLogin")
                    .execute();

            html = res.parse().toString();
            length = html.length();
            counter = 0;

            for (int i = 0; i < length; i++) {
                if (html.startsWith("document.write", i)) {
                    name[counter] = html.substring(i + 41, i + 144);
                    value[counter] = "Login";
                    counter++;
                }
                if (html.startsWith("hidden", i)) {
                    name[counter] = html.substring(i + 13, i + 81);
                    value[counter] = html.substring(i + 90, i + 123);
                    counter++;
                }
            }

        } catch (IOException ioe) {
        } catch (NullPointerException ioe) {
            JOptionPane.showMessageDialog(RunFrame.getInstance(),
                    "Could not open connection to Banners Broker!",
                    "Error",
                    JOptionPane.ERROR_MESSAGE);
        }
        return res;
    }

    public void setUpEwalletData(Connection.Response res) {
        Document doc;
        Elements elements;
        doc = getPage(res, "http://bannersbroker.com/adpubcombo_ewallet/ewallet");
        elements = doc.select("p[class=ewallet_numbers");
        EwalletData ewalletData = EwalletData.getInstance();
        ewalletData.setWalletValue(Double.parseDouble(elements.first().text().replaceAll("[\\D&&[^.]&&[^-]]+", "")));
    }

    public void setUpPanelsData(Connection.Response res) {
        MacroData macroData = MacroData.getInstance();
        TrafficData trafficData = TrafficData.getInstance();
        PanelsData panelsData = PanelsData.getInstance();
        String strona;
        Document doc;
        Elements elements;
        int[] traffic = new int[8];
        int[] macro = new int[7];

        for (int i = 1; i < 8; i++) {
            strona = "http://bannersbroker.com/adpubcombo_manageinventory/viewactivepanels?colour=" + i + "&sort=Qualified";
            doc = getPage(res, strona);

            elements = doc.select("span[id=limit2]");
            macro[i - 1] = Integer.parseInt((elements.first().text().replaceAll("\\D+", "")));

            elements = doc.select("div.number[id=js-tp-bank]");
            traffic[i - 1] = Integer.parseInt((elements.first().text().replaceAll("\\D+", "")));

            elements = doc.select("p[id^=QualDate]");
            if (elements.hasText()) {
                String[] luzem = elements.text().split("[\\D&&[^-]]+");
                Date[] aray = new Date[luzem.length / 4];
                try {
                    int j = 0;
                    while (elements.eq(j).hasText()) {
                        if (elements.eq(j).text() != "")
                            aray[j] = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(elements.eq(j).text());
                        j++;
                    }
                    j = 0;
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                switch (i) {
                    case 1:
                        panelsData.setYellowDays(aray);
                        break;
                    case 2:
                        panelsData.setPurpleDays(aray);
                        break;
                    case 3:
                        panelsData.setBlueDays(aray);
                        break;
                    case 4:
                        panelsData.setGreenDays(aray);
                        break;
                    case 5:
                        panelsData.setRedDays(aray);
                        break;
                    case 6:
                        panelsData.setBlackDays(aray);
                        break;
                    case 7:
                        panelsData.setPrestigeDays(aray);
                        break;
                    default:
                        break;
                }
            }

            elements = getPanelData(doc);
            if (elements.hasText()) {
                int size = getPanelData(doc).size();
                for (int j = 1; j <= size / 2; j++) elements.remove(j);
                String[] luzem = elements.text().split("[\\D&&[^.]]+");
                Double[] aray = new Double[luzem.length];
                for (int j = 0; j < luzem.length; j++)
                    aray[j] = Double.parseDouble(luzem[j]);

                switch (i) {
                    case 1:
                        panelsData.setYellow(aray);
                        break;
                    case 2:
                        panelsData.setPurple(aray);
                        break;
                    case 3:
                        panelsData.setBlue(aray);
                        break;
                    case 4:
                        panelsData.setGreen(aray);
                        break;
                    case 5:
                        panelsData.setRed(aray);
                        break;
                    case 6:
                        panelsData.setBlack(aray);
                        break;
                    case 7:
                        panelsData.setPrestige(aray);
                        break;
                    default:
                        break;
                }
            }
        }
        doc = getPage(res, "http://bannersbroker.com/adpubcombo_trafficbank/managetraffic");
        elements = doc.select("h4[id=trafficLeft_4]");
        if (elements.first() != null)
            traffic[7] = Integer.parseInt((elements.first().text().replaceAll("[\\D+]", "")));

        trafficData.setTraffic(traffic);
        macroData.setMacro(macro);
    }

    public static Elements getPanelData(Document doc) {
        Elements elements = doc.select("span.cost");
        return elements;
    }

    public void setUpPaymentData(Connection.Response res) {
        Document doc;
        Elements elements;
        doc = getPage(res, "http://bannersbroker.com/adpubcombo_manageinventory/viewpackagespurchased");
        elements = doc.select("tr > td[align=center][valign=middle] > div");
        try {
            PaymentData.getInstance().setAbonamentDate(new SimpleDateFormat("yyyy-MM-dd").parse(elements.last().text()));
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    public void setUpTrafficPayment(Connection.Response res) {
        Document doc;
        Elements elements;
        doc = getPage(res, "https://bannersbroker.com/adpubcombo_account/account");
        elements = doc.select("div[class=infogroup] > div[class=tablecont] > table > tbody > tr > td[align=center]:not(td[class])");
        for (int i = 0; i < 5; i++) elements.remove(0);
        int length = elements.size();
        for (int i = 0; i < length / 3; i++) {
            elements.remove(i);
            elements.remove(i);
        }
        PaymentData.getInstance().setTpAmount(elements.size());
        Date[] array = new Date[elements.size()];
        for (int i = 0; i < elements.size(); i++)
            try {
                array[i] = new SimpleDateFormat("yyyy-MM-dd").parse(elements.eq(i).text());
            } catch (ParseException e) {
                e.printStackTrace();
            }
        PaymentData.getInstance().setTpDate(array);
    }
}

构造函数获取电子邮件、密码和框架,在这种情况下,框架并不重要,所以我从主方法 null 发送,当我想从框架发送电子邮件和密码时它获取框架,但每次调试时都不方便这样做跳过登录窗口。

public JsoupClass(String emailText, String passText, MainFrame mainFrame) {
        Connection.Response res;

        res = getLoginData();
        res = doLogin(res, emailText, passText);

        if (checkLogin(res).hasText()) {
            setUpTrafficPayment(res);
            setUpEwalletData(res);
            setUpPanelsData(res);
            setUpPaymentData(res);
            try {
                if (mainFrame != null)
                    mainFrame.dispose();
                new StatisticFrame();
            } catch (ParseException e1) {
                e1.printStackTrace();
            }
        } else {
            JOptionPane.showMessageDialog(RunFrame.getInstance(),
                    "Wrong Login Data!",
                    "Warning",
                    JOptionPane.WARNING_MESSAGE);
        }
    }

getLoginData()方法解析 cookie 和登录所需的一些隐藏字段 doLogin(res, emailText, passText)使用从 获取的数据getLoginData()、我们的电子邮件和密码来登录。下一步是if (checkLogin(res).hasText())checkLogin(res)返回元素,所以如果elements.hasText我们知道我们登录成功,否则不返回。然后当我们登录时,我解析所需的数据以挖掘类巫术方法:

            setUpTrafficPayment(res);
            setUpEwalletData(res);
            setUpPanelsData(res);
            setUpPaymentData(res);

正如我在开始时所说的那样,一切正常,突然间它开始每次都抛出异常。

Banners Broker 是一个私人市场,目前只能通过推荐进行注册。如果任何人想创建一个帐户并尝试登录这里有一个链接来注册。 https://bannersbroker.com/vardius

4

1 回答 1

3

看起来像你打电话checkLogin(null)res = doLogin(res, emailText, passText);您可以在调用之前确保is not null checkLogin

尝试使用:

if (res != null && checkLogin(res).hasText()) {

捕获异常(IOException在您的情况下)并且什么都不做(在doLogingetLoginData)是不好的做法。您可以抛出异常或添加日志,但忽略它可能会在另一个地方伤害您。这正是这里发生的事情......

更改此代码:

} catch (IOException ioe) {
} catch (IllegalArgumentException ioe) {
    JOptionPane.showMessageDialog(RunFrame.getInstance(),
            "Could not open connection to Banners Broker!",
            "Error",
            JOptionPane.ERROR_MESSAGE);

对此:

    } catch (IOException ioe) {
        // Here print the ioe stack trace to whenever you want and check why you get this exception.

    } catch (IllegalArgumentException ioe) {
        JOptionPane.showMessageDialog(RunFrame.getInstance(),
                "Could not open connection to Banners Broker!",
                "Error",
                JOptionPane.ERROR_MESSAGE);
于 2013-03-19T08:57:08.440 回答