Android: String null pointer exception when android error string == null is always false
Android: String null pointer exception when android error string == null is always false
我正在扫描用户 phone 并获取所有设备音乐 uri 的列表。
然后我使用这些 Uris 查找音乐元数据以在 RecyclerView 中设置。我发现有些歌曲在歌曲中没有艺术家、专辑或图像元数据,所以当我 return RecyclerView 的值时,我尝试通过将名称、艺术家等设置为来解决这个问题默认标题。
我尝试了 isEmpty()
、== ""
和 == null
:
对于== null
Android给出了永远不会为null的错误。
这是我的代码:
public class DeviceMusicCollection {
public static ArrayList<DeviceMusicMetadata> getDeviceMusic(Context context)
{
// Get the list of songs on the device
ArrayList <DeviceMusic> deviceMusicArray = MainActivity.deviceMusicStaticArrayList;
// variables for metadata
String metadataTitle;
String metadataArtist;
String metadataAlbum;
byte [] metadataImage;
//Create a new array to retrieve the metadata info for the songs
ArrayList<DeviceMusicMetadata> deviceMusicMetadata = new ArrayList<>();
// Create a metatdata retriever to collect metadata
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
if (deviceMusicArray != null){
for (int i = 0; i < deviceMusicArray.size(); i++ ){
// Create a Uri for each song from the music file address
Uri uri = Uri.fromFile(new File(deviceMusicArray.get(i).getMusicFileAddress()));
// Set the datadource for the metadata retriever
mediaMetadataRetriever.setDataSource(context, uri);
// Extract the title or default
metadataTitle = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
if (metadataTitle.isEmpty() || metadataTitle == null){
metadataTitle = deviceMusicArray.get(i).getMusicFileTitle();
}
// Extract the artist or default
metadataArtist = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
if (metadataArtist.isEmpty()){
metadataArtist = "Artist Unknown";
}
// Extract the album or default
metadataAlbum = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);
if (metadataAlbum.isEmpty()){
metadataAlbum = "Album Unknown";
}
// Extract the image (default handled in adapter)
metadataImage = mediaMetadataRetriever.getEmbeddedPicture();
deviceMusicMetadata.add(new DeviceMusicMetadata(metadataTitle, metadataArtist, metadataAlbum, metadataImage));
}
}
return deviceMusicMetadata;
}
}
据我所知,我在设置时会遇到同样的问题:
String metadataTitle;
String metadataArtist;
String metadataAlbum;
我也试过在 for 循环中初始化它们。我确定这是愚蠢的,但不确定是什么。
在此先感谢您的帮助
您需要先检查它是否不为空,然后再进行其他检查。
使用 if 语句,参数会按照您编写的顺序一个接一个地检查
所以你应该像
if (metadataTitle == null || metadataTitle.isEmpty())
我认为问题在于您在尝试分配 metadataTitle
:
时如何防范 null
// …
if (metadataTitle.isEmpty() || metadataTitle == null) { // <-- HERE
metadataTitle = deviceMusicArray.get(i).getMusicFileTitle();
}
// …
通过这样做,程序将调用 metadataTitle.isEmpty()
,然后确保它不是 null
,而应该是相反的。
尝试这样做:
// …
if (metadataTitle == null || metadataTitle.isEmpty()) { // <-- HERE
metadataTitle = deviceMusicArray.get(i).getMusicFileTitle();
}
// …
我正在扫描用户 phone 并获取所有设备音乐 uri 的列表。
然后我使用这些 Uris 查找音乐元数据以在 RecyclerView 中设置。我发现有些歌曲在歌曲中没有艺术家、专辑或图像元数据,所以当我 return RecyclerView 的值时,我尝试通过将名称、艺术家等设置为来解决这个问题默认标题。
我尝试了 isEmpty()
、== ""
和 == null
:
对于== null
Android给出了永远不会为null的错误。
这是我的代码:
public class DeviceMusicCollection {
public static ArrayList<DeviceMusicMetadata> getDeviceMusic(Context context)
{
// Get the list of songs on the device
ArrayList <DeviceMusic> deviceMusicArray = MainActivity.deviceMusicStaticArrayList;
// variables for metadata
String metadataTitle;
String metadataArtist;
String metadataAlbum;
byte [] metadataImage;
//Create a new array to retrieve the metadata info for the songs
ArrayList<DeviceMusicMetadata> deviceMusicMetadata = new ArrayList<>();
// Create a metatdata retriever to collect metadata
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
if (deviceMusicArray != null){
for (int i = 0; i < deviceMusicArray.size(); i++ ){
// Create a Uri for each song from the music file address
Uri uri = Uri.fromFile(new File(deviceMusicArray.get(i).getMusicFileAddress()));
// Set the datadource for the metadata retriever
mediaMetadataRetriever.setDataSource(context, uri);
// Extract the title or default
metadataTitle = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
if (metadataTitle.isEmpty() || metadataTitle == null){
metadataTitle = deviceMusicArray.get(i).getMusicFileTitle();
}
// Extract the artist or default
metadataArtist = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
if (metadataArtist.isEmpty()){
metadataArtist = "Artist Unknown";
}
// Extract the album or default
metadataAlbum = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);
if (metadataAlbum.isEmpty()){
metadataAlbum = "Album Unknown";
}
// Extract the image (default handled in adapter)
metadataImage = mediaMetadataRetriever.getEmbeddedPicture();
deviceMusicMetadata.add(new DeviceMusicMetadata(metadataTitle, metadataArtist, metadataAlbum, metadataImage));
}
}
return deviceMusicMetadata;
}
}
据我所知,我在设置时会遇到同样的问题:
String metadataTitle;
String metadataArtist;
String metadataAlbum;
我也试过在 for 循环中初始化它们。我确定这是愚蠢的,但不确定是什么。
在此先感谢您的帮助
您需要先检查它是否不为空,然后再进行其他检查。
使用 if 语句,参数会按照您编写的顺序一个接一个地检查 所以你应该像
if (metadataTitle == null || metadataTitle.isEmpty())
我认为问题在于您在尝试分配 metadataTitle
:
null
// …
if (metadataTitle.isEmpty() || metadataTitle == null) { // <-- HERE
metadataTitle = deviceMusicArray.get(i).getMusicFileTitle();
}
// …
通过这样做,程序将调用 metadataTitle.isEmpty()
,然后确保它不是 null
,而应该是相反的。
尝试这样做:
// …
if (metadataTitle == null || metadataTitle.isEmpty()) { // <-- HERE
metadataTitle = deviceMusicArray.get(i).getMusicFileTitle();
}
// …