Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 新的ArrayList对象在方法退出时消失_Java_Arraylist - Fatal编程技术网

Java 新的ArrayList对象在方法退出时消失

Java 新的ArrayList对象在方法退出时消失,java,arraylist,Java,Arraylist,您好,提前谢谢。我在这里相对较新,到目前为止,我已经能够解决我在搜索中遇到的任何问题,但这一个让我感到困惑 我正在编写一个程序,它使用Rest-Assured进行API调用,以获取云服务器中不同对象的概要文件。这些对象是我们可以称之为文件夹的组织文件容器。文件夹具有特定的结构,每个文件夹都有特定的元数据配置文件。我的程序所做的是从返回的JSON创建java对象,并以一种允许它们仍然像文件夹结构一样工作的方式存储它们,这样它们就可以被操纵来执行以下操作:打印文件夹结构、获取特定文件夹的子文件夹、查

您好,提前谢谢。我在这里相对较新,到目前为止,我已经能够解决我在搜索中遇到的任何问题,但这一个让我感到困惑

我正在编写一个程序,它使用Rest-Assured进行API调用,以获取云服务器中不同对象的概要文件。这些对象是我们可以称之为文件夹的组织文件容器。文件夹具有特定的结构,每个文件夹都有特定的元数据配置文件。我的程序所做的是从返回的JSON创建java对象,并以一种允许它们仍然像文件夹结构一样工作的方式存储它们,这样它们就可以被操纵来执行以下操作:打印文件夹结构、获取特定文件夹的子文件夹、查看特定文件夹的名称或ID、添加或删除文件夹等

我将其设置为每个文件夹都是一个对象,其中包含其子文件夹的ArrayList和元数据的变量,构造函数将根据JSON填充所有变量

在使用我的递归方法调用API并将子文件夹添加到它们应该去的地方之后,在类中的方法中,我可以看到它们被正确添加,一旦方法退出,如果我尝试从Main访问列表,我会得到一个空指针异常。请参阅下面的代码示例

编辑:我在下面的代码中添加了额外的测试,以检查递归方法中的数组索引是否为null。创建对象时,构造函数使用
indexOf()
在ArrayList中打印文件夹ID和索引。当它从构造函数返回时,在相同的递归方法中,
getSingleFolder(index).getSubfolders().get(0).getSubfolders().get(0).toString
仍然为空,即使它应该返回刚从构造函数中创建并添加到父文件夹ArrayList(并验证)中的相同文件夹

        public void saveSubfoldersRecursively(Folder folder){
        if (folder.hasSubfolders()){
            getFolderSubfoldersJsonArrayFromRestApi(folder);

            for(int x = 0; x < folder.getFoldersJsonArray().size(); x++) {
                JsonObject currentSubfolderJson = folder.getFoldersJsonArray().get(x).getAsJsonObject();
                JsonObject fullSubfolderProfileObject = getFolderProfileFromRestApi(currentSubfolderJson);
                Folder newSubfolder = folder.addSubfolder(fullSubfolderProfileObject);

                if (newSubfolder.hasSubfolders()) {
                    saveSubfoldersRecursively(newSubfolder);
                }
            }
            if (folder.getId().equals("<folderID>") ) {
                System.out.println("inside saveSubfoldersRecursively");  // this prints fine
// Null Pointer Exception at next line!
                System.out.println("access test 1: " + folder.getId() + " subfolder at index 0: " + folder.getSubFolders().get(0)); 
        }
    }
private boolean hasSubfolders;


    public boolean hasSubfolders() {
    return hasSubfolders;
}
当我返回Main时,我已经编写了一个小的递归方法,只使用名称以标准格式打印结构,它似乎一直工作,直到它到达第三级,然后当它试图访问该级的第一个元素时抛出空指针异常

相反,我使用特定的代码只为刚刚创建并在addSubfolder方法中检查的嵌套子文件夹调用toString,它还返回空指针异常。i、 e

server.getSinglefolder(1).getSubFolders().get(0).getSubFolders().get(0).toString();
据我所知,另一个StackOverflow帖子

我也有同样的问题,但我似乎不明白如何转换解决方案,以适应我的情况,或者如果它不起作用,因为我不应该这样做。谢谢你的帮助

编辑:我又看了一遍那篇文章,他的问题似乎是因为他后来的代码改变了它,但他没有注意到,因为这是一个参考。我不认为这里是这种情况,因为在该方法返回后,直到在main中调用该对象并返回空对象,才会再次访问该对象。我已经搜索和阅读了一整天的文章,这一定是一些愚蠢的东西,我只是看不到。再次感谢你的帮助

编辑2:在进一步测试之后,我注意到添加到ArrayList的文件夹在构造函数中是可验证的,使用
this
获取对象并调用getter获取其ID。但是,当从调用构造函数的递归方法末尾访问ArrayList时,该索引处的ArrayList为null(System.out测试添加到代码示例中)。因此,实际上,在控件返回到main之前,只要构造函数返回,arraylist就会再次为Null。这可能与我声明占位符对象(文件夹、子文件夹、newSubfolder)有关吗从方法内部,因此当它退出时它们被清除?即使是这样,对象本身也应该保持更改,即使临时引用消失了

编辑3:根据要求,以下是
folder.hasSubFolders()
和文件夹构造函数的方法

        public void saveSubfoldersRecursively(Folder folder){
        if (folder.hasSubfolders()){
            getFolderSubfoldersJsonArrayFromRestApi(folder);

            for(int x = 0; x < folder.getFoldersJsonArray().size(); x++) {
                JsonObject currentSubfolderJson = folder.getFoldersJsonArray().get(x).getAsJsonObject();
                JsonObject fullSubfolderProfileObject = getFolderProfileFromRestApi(currentSubfolderJson);
                Folder newSubfolder = folder.addSubfolder(fullSubfolderProfileObject);

                if (newSubfolder.hasSubfolders()) {
                    saveSubfoldersRecursively(newSubfolder);
                }
            }
            if (folder.getId().equals("<folderID>") ) {
                System.out.println("inside saveSubfoldersRecursively");  // this prints fine
// Null Pointer Exception at next line!
                System.out.println("access test 1: " + folder.getId() + " subfolder at index 0: " + folder.getSubFolders().get(0)); 
        }
    }
private boolean hasSubfolders;


    public boolean hasSubfolders() {
    return hasSubfolders;
}
从addSubfolder中调用的文件夹构造函数。请注意,整个构造函数大约有150行,但格式相同,请检查JSON中的成员,如果存在,请将值保存到类变量。如果有人认为有必要,我可以发布整个内容

 //main constructor, parses response string to JSON and pulls all data to fill class variables.
public Folder(JsonObject folderProfile) {

    if (folderProfile.has("database")) {
        this.database = folderProfile.get("database").getAsString();
    }

    if (folderProfile.has("default_security")) {
        this.defaultSecurity = folderProfile.get("default_security").getAsString();
        }
...}
编辑5:程序每个部分的ideone链接。当然,在没有访问rest服务器的情况下,它不会运行,但不幸的是,我无法共享连接信息。我可以向您保证,rest调用功能正常,返回的数据准确无误,并且所有数据都得到了正确处理(在某种程度上是正确的,但可能不是最佳实践)-_-

注意:我知道我需要清理抽象类及其实现方式,我还有很多工作要做,以清理编码实践,但这还远远没有完成,我正在测试的程序只完成了一半。不过,我完全愿意接受这方面的任何建议,因为我一直在学习。谢谢> 主要-

IMContainer-

文件夹-

模板-

服务器-


我怀疑当您递归地将文件夹添加到文件夹arrayList中时,您没有将子文件夹添加到添加的子文件夹中。这会导致子文件夹在第三次递归中抛出NullPointerException。如果这是唯一的问题,请移动

if (newSubfolder.hasSubfolders()) {
    saveSubfoldersRecursively(newSubfolder);
}
到方法的开头可能会有所帮助

但是,在不了解

getFolderSubfoldersJsonArrayFromRestApi


我不能肯定。

我同意Chi Young Jeffrey Lii的回答,这是对这一点的进一步阐述。
addSubfolder()
基本上做了三件事

public Folder addSubfolder(JsonObject folderProfile){
     System.out.println("Adding " + folderProfile.get("id") + " to subfolders of " + this.getId());
     // 1.create new subfolder
     Folder subfolder = new Folder(folderProfile);
     // 2.add subfolder to this subFolders arraylist
     this.subFolders.add(subfolder);
     System.out.println("subfolder added at index " + this.subFolders.indexOf(subfolder));    
     // 3.return subfolder
     return subfolder;
}

如下图所示

执行语句时(将突出显示颜色与图表颜色匹配),蓝色部分是空的
ArrayList
,如果调用
.get(0)
,它将返回null。
System.out.println("access test 1: " + folder.getId() + " subfolder at index 0: " + folder.getSubFolders().get(0)); 
System.out.println("subfolder added at index " + this.subFolders.indexOf(subfolder));    
System.out.println("subfolder's subfolder null check:" + subfolder.getSubFolders().get(0).toString());