Android Studio文件管理器App崩溃,Logcat报NullPointerException求助
问题分析与解决方案
崩溃原因
从Logcat和代码来看,空指针异常出现在File root = new File(FilePath);这一行,因为首次启动FileListActivity时,没有通过Intent传入path参数,导致FilePath为null,而File的构造函数不允许传入null值,直接触发NullPointerException。
另外代码存在逻辑错误:文件操作的代码放在了权限检查之前,即使解决了空指针,没有存储权限的情况下访问外部存储也会抛出异常,且首次启动会直接执行文件操作逻辑,导致崩溃。
修复步骤
1. 处理空指针,设置默认路径
在初始化File对象前,先判断FilePath是否为null,若为null则设置默认的外部存储路径:
String FilePath = getIntent().getStringExtra("path"); // 处理空值,设置默认路径 if (FilePath == null) { FilePath = Environment.getExternalStorageDirectory().getPath(); } File root = new File(FilePath);
2. 调整权限检查与文件操作的顺序
把权限检查逻辑移到文件操作之前,确保只有获取到权限后才执行文件访问:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_file_list); RecyclerView recyclerView = findViewById(R.id.recyclerView); TextView noFiles = findViewById(R.id.noFiles); if(checkPermission()) { // 有权限才执行文件操作 initFileList(recyclerView, noFiles); }else { // 无权限则请求权限 requestPermission(); } } // 把文件操作逻辑抽成单独方法 private void initFileList(RecyclerView recyclerView, TextView noFiles) { String FilePath = getIntent().getStringExtra("path"); if (FilePath == null) { FilePath = Environment.getExternalStorageDirectory().getPath(); } File root = new File(FilePath); File[] filesAndFolders = root.listFiles(); if (filesAndFolders == null || filesAndFolders.length == 0) { noFiles.setVisibility(View.VISIBLE); return; } noFiles.setVisibility(View.INVISIBLE); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setAdapter(new MyAdapter(getApplicationContext(), filesAndFolders)); }
3. 处理权限请求结果
重写onRequestPermissionsResult方法,在用户授予权限后再初始化文件列表:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode == 111){ if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ // 用户授予权限,初始化文件列表 RecyclerView recyclerView = findViewById(R.id.recyclerView); TextView noFiles = findViewById(R.id.noFiles); initFileList(recyclerView, noFiles); }else{ Toast.makeText(this, "没有存储权限无法访问文件", Toast.LENGTH_SHORT).show(); } } }
4. 移除重复启动Activity的逻辑
原代码中在权限允许后会再次启动FileListActivity,这会导致重复创建Activity,造成不必要的开销,直接移除这部分代码即可。
额外注意事项
- 对于Android 10及以上版本,
WRITE_EXTERNAL_STORAGE权限已经被弱化,若需要访问特定目录,可能需要使用MediaStore或者SAF(存储访问框架)。 - 确保在
AndroidManifest.xml中声明了存储权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
内容的提问来源于stack exchange,提问作者Roboproffa
相关产品推荐
相关产品推荐

