如何在制作arrayadapter时修复“参数'files'可能为空”?

时间:2019-12-30 16:26:50

标签: java android-studio android-mediaplayer

我想做一个媒体播放器,它总是抛出nullpointerexception。我被困在这里,这是我的代码:

package MRT.MRT.MRT0012;

import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;


public class MainActivity extends Activity {
    Handler handler=new Handler();
    MediaPlayer mediaPlayer=new MediaPlayer();
    ListView listView;
    Runnable exit=new Runnable() {
        @Override
        public void run() {
            backdoublepressed=false;
        }
    };
    boolean backdoublepressed=false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.activity_main);
        super.onCreate(savedInstanceState);
        listView=findViewById(R.id.list);
        File file=new File(Environment.getExternalStorageDirectory()+"/Musics");
        File[] files=file.listFiles();
        ArrayAdapter<File> adapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,files);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                try {
                    mediaPlayer.setDataSource(listView.getItemAtPosition(position).toString());
                    mediaPlayer.prepare();
                } catch (IOException e) {
                    e.printStackTrace();
                    return;
                }
                mediaPlayer.start();
            }
        });

    }

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

    @Override
    public void onBackPressed() {
        if(backdoublepressed){
            MainActivity.this.finish();
        }
        else{
            backdoublepressed=true;
            Toast.makeText(getApplicationContext(),"press back again to exit",Toast.LENGTH_LONG).show();
            handler.postDelayed(exit,3000);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case(R.id.exit):{MainActivity.this.finish();break;}
            case(R.id.setting):{
                Intent intent=new Intent(getApplicationContext(),SettingActivity.class);
                startActivity(intent);
            }
        }
        return super.onOptionsItemSelected(item);
    }

}

该异常始于使用file.listFiles()声明和初始化files变量。我犯了什么错误吗?

   File file=new File(Environment.getExternalStorageDirectory()+"/Musics");
    File[] files=file.listFiles();
    ArrayAdapter<File> adapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,files);
    listView.setAdapter(adapter);

如果有人能解决这个问题,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

参数'files'可以为null并非错误,它是linter工具(大概是Android Studio)发出的警告。您可以随意忽略它。

listFiles()方法的结果可能为null;错误情况就是这种情况,例如根本不存在该路径,或者您的进程无权列出其内容。这是糟糕的API设计;真正的Java可以解决此问题(java.nio.file API),但是我认为这在android中不可用。

添加空检查将使警告消失。例如:

if (files == null) files = new File[0]; // treat failure the same as an empty directory.

是否合适–由您决定。

答案 1 :(得分:1)

这段代码中的所有内容都可以,没问题,唯一的问题可能是,目录中是否存在名为Musics的文件夹,我认为没有此类文件夹。创建文件夹,一切正常。