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

动态ListView关联JSONArray时,PDF文件检测及按钮状态切换问题排查

问题分析与修复方案

我来帮你排查代码里的问题,顺便给出更稳妥的修复方案:

1. 导致崩溃与逻辑错误的核心问题

  • 空指针异常根源:当目标文件夹/materialpdffolder/不存在,或者应用没有外部存储读取权限时,path.listFiles()会返回null,这时候遍历list直接就会触发空指针崩溃。
  • 数组越界问题:循环条件x <= list.length是错误的——数组索引从0开始,正确范围是0到list.length-1,用<=会访问超出数组边界的位置,引发数组越界异常。
  • 冗余遍历逻辑:你不需要遍历文件夹里所有文件来匹配目标,直接通过文件名构造完整路径、检查文件是否存在就足够了,既高效又简洁。

修复后的完整代码

// 先处理文件夹基础逻辑,确保路径合法
String baseStoragePath = Environment.getExternalStorageDirectory() + "/materialpdffolder/";
File pdfFolder = new File(baseStoragePath);

// 可选:如果文件夹不存在,先创建(下载前确保目录可用)
if (!pdfFolder.exists()) {
    pdfFolder.mkdirs(); // mkdirs支持创建多级目录,比mkdir更稳妥
}

// 获取当前Item的文件名,先做空值判断
String targetFileName = materialList.get(position).getMaterial_file_name();
if (targetFileName == null) {
    DVmaterial.setText("Download(Unknown File)");
    return;
}

// 构造目标文件的完整路径
File targetPdfFile = new File(baseStoragePath, targetFileName);

// 直接检查文件是否存在且是合法文件
if (targetPdfFile.exists() && targetPdfFile.isFile()) {
    DVmaterial.setText("View(" + targetFileName + ")");
    // 这里绑定View按钮的点击事件
} else {
    DVmaterial.setText("Download(" + targetFileName + ")");
    // 这里绑定Download按钮的点击事件
}

额外注意事项

  • 权限处理:如果你的应用运行在Android 6.0(API 23)及以上版本,必须动态申请READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限,否则无法访问外部存储。
  • 空值防御:一定要先判断getMaterial_file_name()是否为null,避免后续字符串操作触发空指针。
  • 目录创建:用mkdirs()替代mkdir(),前者能自动创建不存在的父目录,适配更多场景。

内容的提问来源于stack exchange,提问作者Hussain Aali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:36:41