0

私はBlackberry開発アプリケーションの初心者です。すべてのxml解析データをオブジェクトに格納し、それらをベクトルに設定しようとしています。

public class XmlParser extends MainScreen {
    Database d;
    private HttpConnection hcon = null;

    private Vector binN;
    public Vector getBinN() {
        return binN;
    }

    public void setBinN(Vector bin) {
        this.binN = bin;
    }

    LabelField from;
    LabelField ttl;
    LabelField desc;
    LabelField date;

    public XmlParser() {
        LabelField title = new LabelField("Headline News" ,LabelField.HCENTER|LabelField.USE_ALL_WIDTH);
        setTitle(title);

        try {
            URI myURI = URI.create("file:///SDCard/Database/WebFeed.db"); 
            d = DatabaseFactory.open(myURI);
            Statement st = d.createStatement("SELECT feed_url, feed_name FROM WebFeed");
            st.prepare();
            Cursor c = st.getCursor();
            while (c.next()) {
                Row r = c.getRow();
                hcon = (HttpConnection)Connector.open(r.getString(0));
                hcon.setRequestMethod(HttpConnection.GET);
                        hcon.setRequestProperty("User-Agent", "Profile/MIDP-1.0 Configuration/CLDC-1.0");
                        hcon.setRequestProperty("Content-Length", "0");
                        hcon.setRequestProperty("Connection", "close");
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder = factory.newDocumentBuilder();

                builder.isValidating();
                Document document = builder.parse(hcon.openInputStream());

                Element rootElement = document.getDocumentElement();
                rootElement.normalize();

                NodeList list = document.getElementsByTagName("item");

                int i=0;
                while (i<10){
                    Node item = list.item(i);
                    if(item.getNodeType() != Node.TEXT_NODE) {
                        NodeList itemChilds = item.getChildNodes();
                        int j=0;
                        while (j<10){
                            Node detailNode = itemChilds.item(j);
                            if(detailNode.getNodeType() != Node.TEXT_NODE) {                                
                                if(detailNode.getNodeName().equalsIgnoreCase("title")) {
                                    ttl = new LabelField(getNodeValue(detailNode)) {
                                        public void paint(Graphics g) {
                                            g.setColor(Color.BLUE);
                                            super.paint(g);
                                        }
                                    };
                                    from = new LabelField(r.getString(1), LabelField.FIELD_RIGHT|LabelField.USE_ALL_WIDTH);
                                    ttl.setFont(Font.getDefault().derive(Font.BOLD));
                                    from.setFont(Font.getDefault().derive(Font.BOLD));
                                    add (from);
                                    add (ttl);
                                } else if(detailNode.getNodeName().equalsIgnoreCase("description")) {

                                    desc = new LabelField(getNodeValue(detailNode), 0, 70, USE_ALL_WIDTH);
                                    add(desc);
                                } else if(detailNode.getNodeName().equalsIgnoreCase("dc:date")) {
                                    date = new LabelField(getNodeValue(detailNode), 11, 5, USE_ALL_WIDTH) {
                                        public void paint(Graphics g) {
                                            g.setColor(Color.ORANGE);
                                            super.paint(g);
                                        }
                                    };
                                    add(date);
                                    add(new SeparatorField());
                                } else if(detailNode.getNodeName().equalsIgnoreCase("pubDate")) {
                                    date = new LabelField(getNodeValue(detailNode), 0, 22, USE_ALL_WIDTH) {
                                        public void paint(Graphics g) {
                                            g.setColor(Color.ORANGE);
                                            super.paint(g);
                                        }
                                    };
                                    add(date);
                                    add(new SeparatorField());
                                } else {
                                    System.out.println("not the node");
                                }
                            } else {
                                System.out.println("not text node");
                            }
                            j++;
                        }
                    }
                    i++;
                    BinNews bin = new BinNews();
                    bin.setProv(from.getText());
                    bin.setTitle(ttl.getText());
                    bin.setDesc(desc.getText());
                    bin.setDate(date.getText());
                    binN.addElement(bin);
                }
                setBinN(binN);
            }
            //setBinN(binN);
            st.close();
            d.close();
        } catch (Exception e)  {
            add (new LabelField(e.toString(),LabelField.HCENTER|LabelField.USE_ALL_WIDTH));
            System.out.println(e.toString());
        }
    }

    public String getNodeValue(Node node) {
        NodeList nodeList = node.getChildNodes();
        Node childNode = nodeList.item(0);
        return childNode.getNodeValue();
    }
}

BinNewsというオブジェクトからbinNというベクトルにすべてのデータを保存しようとしています。しかし、デバッグを行うと、「binN.addElement(bin)」が機能しないため、BinNの値がnullであることがわかりました。お知らせ下さい。

4

1 に答える 1

0

まず、while(i <10)ループが完了するまで、実際にはsetBinNを呼び出しません。したがって、binN.addElement(bin)と言うと、binNはnullになります。

ただし、setBinN(binN)呼び出しは、binNを渡してからそれ自体に設定しているため、意味がありません。これは何もしません。

あなたができることはbinN = new Vector();コンストラクターの一番上にあることです、そしてそれは後でnullになることはありません。BinNewsオブジェクトをbinNに直接追加する場合は、後でsetBinN呼び出しが必要になるとは思いません。

于 2012-06-05T02:56:06.950 に答える