java - 多次循环一个方法会导致错误

标签 java android loops nullpointerexception null

我正在循环一个返回 DocumentFile 100 次甚至更多次的方法。很多时候,该方法已经循环了大约 35 次,但仍返回 null。

这是正在循环的方法。

 public  static DocumentFile documentfile(final File file ) {

    for (UriPermission permissionUri :con.getContentResolver().getPersistedUriPermissions()) {

        DocumentFile rootDocFile = DocumentFile.fromTreeUri(con, permissionUri.getUri());

        String[] parts = (file.getPath()).split("\\/");

        for (int i = 3; i < parts.length; i++) {

            if (rootDocFile != null)
            {
                rootDocFile = rootDocFile.findFile(parts[i]);
            }

            else {

                rootDocFile = DocumentFile.fromTreeUri(con,permissionUri.getUri() );
                rootDocFile = rootDocFile.findFile(parts[i]);
            }

        }


        return rootDocFile;

    }
    return null;
}

这就是我循环方法的方式

for(int i=0;i<size;i++)
{
    documentfile(file).createFile(mime, name)
}

以上所有代码都在异步任务内执行。

任何帮助将非常感激。

编辑:尝试使用更新的代码,但仍然收到相同的错误。

更新代码

public static DocumentFile DocumentFile(final File file)
{

    DocumentFile rootDocFile = DocumentFile.fromTreeUri(con, permission().getUri());

    String[] parts = (file.getPath()).split("\\/");

    for (int i = 3; i < parts.length; i++)
    {

        rootDocFile = rootDocFile.findFile(parts[i]);

    }
    return rootDocFile;
}

public static UriPermission permission()
{
    for (UriPermission permissionUri : con.getContentResolver().getPersistedUriPermissions())
    {
        final File uri_path = new File(FileUtil.getFullPathFromTreeUri(permissionUri.getUri(), con));

        if (uri_path.getName().toLowerCase().equals(new File("SD_CARD_PATH").getName().toLowerCase()))
        {
            return permissionUri;

        }

    }

    return null;
}

这就是我检查授予的权限是否适用于 SD 卡的方法

public static boolean wrong_directory_selected(Uri uri, Context con)
    {

        final File uri_path=new File(FileUtil.getFullPathFromTreeUri(uri,con));
        if(uri_path.getName().toLowerCase().equals(new File("SD CARD PATH").getName().toLowerCase()))
        {

            return false;
        }
        return  true;
    }

最佳答案

在代码的 else 部分和第一行中,您将仅从 sd-card 创建一个新的 DocumentFile' s URI,然后在第二行,您尝试在 sd-card 的根目录中查找一个文件,但它没有为您提供任何内容。

在您从用户提供的 URI 中获取 null 后,我无法猜测您的 else 部分背后的逻辑。

当您从此方法中得到 null 时,这意味着用户选择了错误的目录作为 sd-card。 因此,您要做的第一件事就是要求用户提供 sd-card 的正确路径。

public static DocumentFile documentfile(final File file ) {   
  for (UriPermission permissionUri : con.getContentResolver().getPersistedUriPermissions()) {   
        DocumentFile rootDocFile = DocumentFile.fromTreeUri(con, permissionUri.getUri());    
        String[] parts = (file.getPath()).split("/");    
          for (int i = 3; i < parts.length; i++) {        
            if (rootDocFile != null) {
                rootDocFile = rootDocFile.findFile(parts[i]);
            }
            if (rootDocFile != null) {
                break;
            }
            //else {
            //    rootDocFile = DocumentFile.fromTreeUri(con, permissionUri.getUri());
            //    rootDocFile = rootDocFile.findFile(parts[i]);
            //}        
          }
      }
      return rootDocFile;
}

如果rootDocFile为空,则询问用户正确的路径

参见我之前的解释here

关于java - 多次循环一个方法会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45263806/

相关文章:

java - "Failed to instantiate WebApplicationInitializer class"如何解决

java - 将 RTP 视频流(H264 编解码器)写入 mp4 文件

c - 将数组中的值设置为仅等于 1 或 0

Python循环通过文本文件读取数据

java - "Variable might not have been initialized"是什么意思?

java - 如何基于某个类实例化具体的实现?

java - 预先创建的 SQLite 数据库集成到 Android 应用程序中

android - SQLite 中的 NOT NULL 列和错误捕获

android - 具有自定义背景颜色的 Lollipop 按钮

从循环复制到变量 c