You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:45:42