无法理解空指针的原因

时间:2013-08-29 08:32:34

标签: java android nullpointerexception

我正在尝试在以下代码中运行一个线程,但它因某种未知原因而崩溃。 这是代码 - >

public class StaticRef extends Activity implements Runnable
{   
Cursor cursor;
Thread tSearchSongs=new Thread(this,"SearchSongs");
WritingXML wxml;

public void searchforsongs()
{
    tSearchSongs.start();
}

@Override
public void run() 
{
    Looper.prepare();
    try
    {
    wxml=new WritingXML();
    String[] STAR = { "*" };        
    Uri allsongsuri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
    cursor = managedQuery(allsongsuri, STAR, selection, null, null);
    if (cursor != null) 
    {
        if (cursor.moveToFirst())
        {
            do 
            {
                //SongName
                String song_name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
                //SongID
                int song_id = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media._ID));
                //SongPath
                String fullpath = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
                //Song's album name
                String album_name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
                //Song's album ID
                int album_id = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
                //Song's artist name
                String artist_name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
                //Song's artist ID
                int artist_id = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST_ID));
                try
                {
                    wxml.AddDatatoXML(Integer.toString(song_id) , song_name, fullpath);
                }
                catch(Exception exp)
                {
                    Log.e("~~Exception Occurred in StaticRef~~", exp.toString());
                }
            } while (cursor.moveToNext());
        }
        cursor.close();
    }
    }
    catch(NullPointerException exp)
    {
        Log.e("~~Null Pointer Exception~~",exp.toString());
        android.util.Log.e("->>" , "~~stacktrace~~", exp);
    }
    catch(Exception exp)
    {
        Log.e("~~Exception~~",exp.toString());
    }
}

}

以下是其LOGCAT

08-29 13:54:03.149: E/~~Null Pointer Exception~~(13899): java.lang.NullPointerException
08-29 13:54:03.159: E/->>(13899): ~~stacktrace~~
08-29 13:54:03.159: E/->>(13899): java.lang.NullPointerException
08-29 13:54:03.159: E/->>(13899):   at   android.content.ContextWrapper.getContentResolver(ContextWrapper.java:91)
08-29 13:54:03.159: E/->>(13899):   at android.app.Activity.managedQuery(Activity.java:1708)
08-29 13:54:03.159: E/->>(13899):   at com.example.boombastic.StaticRef.run(StaticRef.java:53)
08-29 13:54:03.159: E/->>(13899):   at java.lang.Thread.run(Thread.java:856)

我还想知道什么是looper及其在线程执行中的重要意义?

2 个答案:

答案 0 :(得分:2)

如果在活动的onCreate()之前调用managedQuery()方法,则该方法将没有有效的上下文。有关详细信息,请参阅此问题:why does getContentResolver() within Application cause NullPointerException?

答案 1 :(得分:0)

Looper是用于运行消息循环的线程。默认情况下,线程没有消息,因此您必须自己实现它们。

关于NPE,请查看allprog的答案。