调试NullPointerException

时间:2014-04-06 01:47:52

标签: android nullpointerexception

我正在建立一个音乐播放器。启动应用程序时会发生错误。

我搜索过的术语"引起的:java.lang.NullPointerException"在谷歌上,找出原因,看起来好像它会抛出某种类型的空命令?看着logcat,我看到了......

04-06 13:25:16.444: E/AndroidRuntime(30139): Caused by: java.lang.NullPointerException
04-06 13:25:16.444: E/AndroidRuntime(30139):    at com.ascendapps.nexplay.SongsManager.getPlayList(SongsManager.java:25)
04-06 13:25:16.444: E/AndroidRuntime(30139):    at com.ascendapps.nexplay.MainActivity.onCreate(MainActivity.java:79)
04-06 13:25:16.444: E/AndroidRuntime(30139):

所以我查看了SongsManager课程并查看第25行

public ArrayList<HashMap<String, String>> getPlayList(){
    File home = new File(MEDIA_PATH);
    if (home.listFiles(new FileExtensionFilter()).length > 0) {
        for (File file : home.listFiles(new FileExtensionFilter())) {
            HashMap<String, String> song = new HashMap<String, String>();
            song.put("songTitle", file.getName().substring(0, (file.getName().length() - 4)));
            song.put("songPath", file.getPath());

            // Adding each song to SongList
            songsList.add(song);
        }
    }
    // return songs list array
    return songsList;
}

查看代码时,错误位于此行if (home.listFiles(new FileExtensionFilter()).length > 0) {

因此,在对此进行了一些研究后,我发现了一种通过将代码更改为...来绕过此null异常错误的方法。

public ArrayList<HashMap<String, String>> getPlayList(){

    Log.d("testsd",MEDIA_PATH);
    File home = new File(MEDIA_PATH);

//  if (home.listFiles(new FileExtensionFilter()).length > 0) //don't use this to avoid null pointer exception !
    if (home.listFiles(new FileExtensionFilter())!=null) {
        for (File file : home.listFiles(new FileExtensionFilter())) {
            HashMap<String, String> song = new HashMap<String, String>();


            song.put("songTitle", file.getName().substring(0, (file.getName().length() - 4)));
            song.put("songPath", file.getPath());

            // Adding each song to SongList


            songsList.add(song);

        }
    }
    // return songs list array
    return songsList;
}

通过用上面的代码替换代码,它修复了空异常错误,但它开始给我另一个错误。这是错误

04-06 13:36:33.754: E/AndroidRuntime(30586): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
04-06 13:36:33.754: E/AndroidRuntime(30586):    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
04-06 13:36:33.754: E/AndroidRuntime(30586):    at java.util.ArrayList.get(ArrayList.java:308)
04-06 13:36:33.754: E/AndroidRuntime(30586):    at com.ascendapps.nexplay.MainActivity.playSong(MainActivity.java:281)
04-06 13:36:33.754: E/AndroidRuntime(30586):    at com.ascendapps.nexplay.MainActivity.onCreate(MainActivity.java:82)

所以我检查了我的MainActivity类,这些是错误在mp.setDataSource(songsList.get(songIndex).get("songPath"));

上的行

第281行(整体功能)

/**
     * Function to play a song
     * @param songIndex - index of song
     * */
    public void  playSong(int songIndex){
        // Play song
        try {
            mp.reset();
            mp.setDataSource(songsList.get(songIndex).get("songPath"));
            mp.prepare();
            mp.start();
            // Displaying Song title
            String songTitle = songsList.get(songIndex).get("songTitle");
            songTitleLabel.setText(songTitle);

            // Changing Button Image to pause image
            btnPlay.setImageResource(R.drawable.btn_pause);

            // set Progress bar values
            songProgressBar.setProgress(0);
            songProgressBar.setMax(100);

            // Updating progress bar
            updateProgressBar();            
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

这是第82行

// By default play first song
        playSong(0);

我一直在看这些代码。我一直在看新的错误,但我真的不知道要改变什么?我尝试将0更改为更大的数字,如下面的1,5,10,15,20,没有任何反应。同样的错误。我看了第281行。

如果我正在阅读这些记录错误,请告诉我。此外,如果您认为我应该将我的代码恢复到我得到零点异常错误的位置,并且如果您知道如何修复那里的山雀也让我知道。以及如何防止下次发生此错误的一些提示。谢谢你的阅读!

3 个答案:

答案 0 :(得分:3)

如果您的NullPointerException是由此引起的

home.listFiles(new FileExtensionFilter()).length

然后

home.listFiles(new FileExtensionFilter())

似乎是null。这可能是因为listFiles函数可以返回null

  

一组抽象路径名,表示此抽象路径名表示的目录中的文件和目录。如果目录为空,则数组将为空。如果此抽象路径名不表示目录,或者发生I / O错误,则返回null。

这意味着MEDIA_PATH不是您认为的目录路径。

越界异常是由这一行引起的:

mp.setDataSource(songsList.get(songIndex).get("songPath"));

songIndex中不存在songsList的含义。如您的例外中所述:

Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0

您不能在零元素列表中引用元素0,它是第一个元素

由于songsList仅在MEDIA_PATH目录中找到数据而被添加,MEDIA_PATH在某种程度上是错误的...希望当你用{解决问题时} {1}},这两个问题都将得到解决。

答案 1 :(得分:2)

请替换您的代码:

if (home.listFiles(new FileExtensionFilter())!=null && home.listFiles(new FileExtensionFilter()).length > 0)
{

}

并且检查listFiles没有列表。即你的文件路径不正确,文件不包含任何歌曲。请确保您的SD卡包含任何.mp3文件。

答案 2 :(得分:-2)

我非常确定Manifest您忘记了对READ EXTERNAL STORAGE的许可,这就是您获得IndexOutOfBoundsException的原因。