NullPointerException в приложении Android RSS

Я пытаюсь создать приложение для чтения RSS для Android, но продолжаю получать исключение нулевого указателя. Я новичок в java и не могу сказать, не возвращает ли URL-адрес фида какие-либо данные или данные не хранятся должным образом.

мой логарифм читает:

08-08 18:44:25.840: E/Trace(621): error opening trace file: No such file or directory (2)
08-08 18:44:25.910: W/ActivityThread(621): Application com.app.fullmetalmanga is waiting for the debugger on port 8100...
08-08 18:44:25.930: I/System.out(621): Sending WAIT chunk
08-08 18:44:25.951: I/dalvikvm(621): Debugger is active08-08 18:44:26.140: I/System.out(621): Debugger has connected
08-08 18:44:27.710: I/System.out(621): debugger has settled (1382)
08-08 18:44:29.291: D/gralloc_goldfish(621): Emulator without GPU emulation detected.
08-08 18:44:48.060: W/System.err(621): java.lang.NullPointerException
08-08 18:44:48.760: W/System.err(621):  at java.util.Calendar.setTime(Calendar.java:1324)
08-08 18:44:48.810: W/System.err(621):  at java.text.SimpleDateFormat.formatImpl(SimpleDateFormat.java:536)
08-08 18:44:49.050: W/System.err(621):  at java.text.SimpleDateFormat.format(SimpleDateFormat.java:821)
08-08 18:44:49.150: W/System.err(621):  at java.text.DateFormat.format(DateFormat.java:376)
08-08 18:44:49.490: W/System.err(621):  at com.app.fullmetalmanga.RssItem.getDate(RssItem.java:48)
08-08 18:44:49.810: W/System.err(621):  at com.app.fullmetalmanga.MainActivity$RSSHandler.endElement(MainActivity.java:146)
08-08 18:44:50.090: W/System.err(621):  at org.apache.harmony.xml.ExpatParser.endElement(ExpatParser.java:156)
08-08 18:44:50.250: W/System.err(621):  at org.apache.harmony.xml.ExpatParser.appendBytes(Native Method)
08-08 18:44:50.410: W/System.err(621):  at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:513)
08-08 18:44:50.610: W/System.err(621):  at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:474)
08-08 18:44:50.791: W/System.err(621):  at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:321)
08-08 18:44:50.990: W/System.err(621):  at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:279)
08-08 18:44:51.800: W/System.err(621):  at com.app.fullmetalmanga.MainActivity$SAXHelper.parseContent(MainActivity.java:112)
08-08 18:44:51.870: W/System.err(621):  at com.app.fullmetalmanga.MainActivity$loadingTask.doInBackground(MainActivity.java:74)
08-08 18:44:52.350: W/System.err(621):  at com.app.fullmetalmanga.MainActivity$loadingTask.doInBackground(MainActivity.java:1)
08-08 18:44:52.700: W/System.err(621):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
08-08 18:44:53.070: W/System.err(621):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
08-08 18:44:53.190: W/System.err(621):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
08-08 18:44:53.370: W/System.err(621):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
08-08 18:44:53.561: W/System.err(621):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
08-08 18:44:53.980: W/System.err(621):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
08-08 18:44:54.051: W/System.err(621):  at java.lang.Thread.run(Thread.java:856)

И моя основная деятельность:

public class MainActivity extends Activity {
/** Called when the activity is first created. */
ListView lv1;
ProgressDialog ShowProgress;
public ArrayList<RssItem> RssItemList = new ArrayList<RssItem>();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    lv1 = (ListView) findViewById(R.id.listView1);

    ShowProgress = ProgressDialog.show(MainActivity.this, "",
            "Loading. Please wait...", true);
    new loadingTask().execute("http://fandom.com/rss/news/manga");

    lv1.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            Intent intent = new Intent(Intent.ACTION_VIEW).setData(Uri
                    .parse(RssItemList.get(position).getTitle()));
            startActivity(intent);

        }
    });       
}


class loadingTask extends AsyncTask<String, Void, String> {

    protected String doInBackground(String... urls) {

        SAXHelper sh = null;
        try {
            sh = new SAXHelper(urls[0]);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        sh.parseContent("");
        return "";

    }

    protected void onPostExecute(String s) {
        lv1.setAdapter(new EfficientAdapter(MainActivity.this, RssItemList));
        ShowProgress.dismiss();

    }
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}




class SAXHelper {
public HashMap<String, String> userList = new HashMap<String, String>();
private URL url2;

public SAXHelper(String url1) throws MalformedURLException {
    this.url2 = new URL(url1);
}

public RSSHandler parseContent(String parseContent) {
    RSSHandler df = new RSSHandler();
    try {

        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
        xr.setContentHandler(df);
        xr.parse(new InputSource(url2.openStream()));
    } catch (Exception e) {
        e.printStackTrace();
    }
    return df;
}
}


class RSSHandler extends DefaultHandler {

private RssItem currentPost = new RssItem();
StringBuffer chars = new StringBuffer();

@Override
public void startElement(String uri, String localName, String qName,
        Attributes atts) {

    chars = new StringBuffer();
    if (localName.equalsIgnoreCase("item")) {

    }
}

@Override
public void endElement(String uri, String localName, String qName)
        throws SAXException {

    if (localName.equalsIgnoreCase("title")
            && currentPost.getTitle() == null) {
        currentPost.setTitle(chars.toString());

    }
    if (localName.equalsIgnoreCase("pubDate")
            && currentPost.getDate() == null) {
        currentPost.setDate(chars.toString());

    }
    /*if (localName.equalsIgnoreCase("thumbnail")
            && currentPost.getThumbnail() == null) {
        currentPost.setThumbnail(chars.toString());

    } */
    if (localName.equalsIgnoreCase("link")
            && currentPost.getLink() == null) {
        currentPost.setLink(chars.toString());
    }

    if (localName.equalsIgnoreCase("item")) {
        RssItemList.add(currentPost);
        currentPost = new RssItem();
    }

}

@Override
public void characters(char ch[], int start, int length) {
    chars.append(new String(ch, start, length));
}

   }

}

Мой класс RssItem:

public class RssItem {

static SimpleDateFormat FORMATTER = 
        new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
    private String title;
    private URL link;
    private String description;
    private Date date;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title.trim();
    }
    // getters and setters omitted for brevity 
    public URL getLink() {
        return link;
    }

    public void setLink(String link) {
        try {
            this.link = new URL(link);
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description.trim();
    }

    public String getDate() {
        return FORMATTER.format(this.date);
    }

    public void setDate(String date) {
        // pad the date if necessary
        while (!date.endsWith("00")){
            date += "0";
        }
        try {
            this.date = FORMATTER.parse(date.trim());
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }


}

Мой код был создан с использованием этого пример. Изменение только URL-адреса и использование моего собственного модифицированного файла «Post». (переименован в RssItem)


person Davidrd91    schedule 08.08.2012    source источник
comment
Можете ли вы опубликовать свой класс RssItem? Ошибка возникает в строке 48 этого.   -  person D.A    schedule 09.08.2012
comment
отредактировано по вашему запросу. Строка 48 — это метод getDate().   -  person Davidrd91    schedule 09.08.2012
comment
Пожалуйста, не используйте StringBuffer, когда вы можете использовать StringBuilder.   -  person Peter Lawrey    schedule 13.08.2012


Ответы (2)


Похоже, что date в RssItem имеет значение null, когда вы передаете его в свой SimpleDateFormat, возникает исключение:

public String getDate() {
    return FORMATTER.format(this.date); // FORMATTER cannot format a null value
}

Вам нужно определить date по умолчанию или другой вежливый метод обработки этого:

public String getDate() {
    if(this.date == null)
        return "";
    return FORMATTER.format(this.date);
}
person Sam    schedule 09.08.2012
comment
Это исправило это, спасибо!! .. также есть ли ссылка на то, где я мог бы научиться лучше читать Logcat? - person Davidrd91; 09.08.2012
comment
Я не знаю никаких гидов. Но 1) найдите самую низкую причину (которая не всегда присутствует), 2) исследуйте, что вызывает это исключение, 3) обратите внимание к пространствам имен (com.android.xxx), наиболее важным является ваше пространство имен (com.app.fullmetalmanga.xxx). Например, вы не можете контролировать то, что происходит в java.util.Calendar, но вы можете контролировать то, что вы передаете в java.util.Calendar на четыре уровня вверх по стеку. Наконец, круглые скобки в конце каждой строки содержат (имя файла и номер строки). Надеюсь, это поможет! - person Sam; 09.08.2012

Похоже, вы никогда не инициализируете свой атрибут даты в RssItem. Вы можете добавить проверку в getDate() для инициализации атрибута даты, если это еще не сделано. Или еще лучше, сделайте это в своем конструкторе. Я не очень хорошо знаком с работой с RSS-каналами.

person D.A    schedule 09.08.2012