我正在建立一个音乐播放器。启动应用程序时会发生错误。
我搜索过的术语"引起的: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行。
如果我正在阅读这些记录错误,请告诉我。此外,如果您认为我应该将我的代码恢复到我得到零点异常错误的位置,并且如果您知道如何修复那里的山雀也让我知道。以及如何防止下次发生此错误的一些提示。谢谢你的阅读!
答案 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
的原因。