【问题标题】:Making multiple objects in a for-loop在for循环中创建多个对象
【发布时间】:2010-03-07 02:43:44
【问题描述】:

我的 Java 代码应该在一个 for 循环中创建多个对象,然后将每个对象添加到一个数组中。但是,一旦循环结束,代码只是将相同的(这是 for 循环中的最后一个)对象复制到数组中的每个索引 i 中。

我怎样才能纠正这个问题,让每个单独的对象在数组中的正确索引中?

如有必要,我可以发布代码,但如果有人能给我一个例子说明这是如何工作的,那就太好了。

for (int i = 0; i < file.listFiles().length; i++) {
    if (fileList[i].isFile() && !fileList[i].isHidden() && fileList[i].getName().substring(fileList[i].getName().length() - 4).equalsIgnoreCase(".mp3")
            && !fileList[i].equals(null)) {
        try {
            songs.add(new Song(fileList[i]));
            //System.out.println(songs[i].getTitle());
            //playlistInfo[i] = fileList[i].getName();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TagException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

这里是我将一些对象信息打印到控制台的地方。

System.out.println(getSong(1).getTitle());
System.out.println(getSong(4).getTitle());

【问题讨论】:

  • 发布您现有的代码会很有帮助。
  • 请发布您的代码,这将有很大帮助。
  • 发布你的例子,我们来看看
  • 你能把你的代码贴在你列出歌曲的地方吗?也许问题出在打印时而不是插入时
  • 我们需要看看 getSong(int) 做了什么,可能还有 getTitle() 实现的相关部分。

标签: java object loops


【解决方案1】:

应该很简单

for (int ii = 0; ii < yourArray.length; ii++) {
    yourArray[ii] = new YourObject();
}

如果不查看您的代码,我们无法告诉您问题所在。

【讨论】:

    【解决方案2】:

    你的代码

    int i=1; i<file.listFiles().length-1
    

    应该是

    int i=0; i<file.listFiles().length
    

    您从数组中的第二个元素开始(因为第一个元素为零)并提前结束一个,因为 '

    【讨论】:

    • 是的,以前就是这样,但由于某种原因,我在数组的第 0 个索引上收到了 NullPointerException,这本身就是另一个问题! :P
    • 添加一些东西来检查 fileList[i] 是否不为空。你应该从零开始。
    • @Rodney:您现在运行循环的方式几乎肯定是错误的。我认为 Ravi 的建议是一个很好的建议。如果您仍然收到空指针异常,请准确告诉我们您的代码的哪一行引发了它。
    • 我会将代码更新为我已更改的内容。空元素的过滤器现在在那里。谢谢!此外,当 //playlistInfo[i] = fileList[i].getName();行未注释,我得到一个 ArrayIndexOutOfBounds 异常。
    • @Rodney:i 的什么值给了你 ArrayIndexOutOfBoundsException?您可以在调试器中检查 fileList[] 以查看您为数组的每个元素分配了一个值,并且该数组具有您期望的大小吗?
    【解决方案3】:

    如果您的 if 条件不为真,您的歌曲数组中将有空项目。我建议使用 ArrayList 类并在找到它们时将它们添加到那里:

    List<Song> songs = new ArrayList<Song>();
    for (int i=1; i<file.listFiles().length-1; i++) {
        if (fileList[i].isFile() && !fileList[i].isHidden() && fileList[i].getName().substring(fileList[i].getName().length()-4).equalsIgnoreCase(".mp3")) {
            songs.add(new Song(fileList[i]));
        }
    }
    

    我还建议您:

    • 使用File.listFiles方法获取符合给定条件的文件;您在 Commons IO 项目的 org.apache.commons.io.filefilter 包中有一堆预定义的过滤器;
    • 在进行比较之前检查文件名长度或使用 Commons IO 库中的FilenameUtils.getExtension 方法来获取文件扩展名(您可能认为这有点矫枉过正,但是...);
    • 使用列表而不是数组;
    • 我认为您对 Song 类的实例化不容易产生异常。更高级别的 try...catch 块可能更合适。而且你对异常的处理是完全错误的,如果你不会对它做更多的事情而不是简单地打印它的堆栈跟踪,最好不要捕获它。

    关于您的问题,我不确定所有生成的对象如何相同,除非您的 fileList 数组在所有位置都包含相同的元素。

    【讨论】:

    • 感谢您的所有建议。我一定会以更合适的方式处理异常;但是,我还没有到那一步。而且我已经切换到数组列表,但我仍然在所有索引中得到相同的对象。再次感谢!
    • 也许你应该在循环之外寻找你的问题。您可能必须对其进行调试或在各处添加打印语句。我会确保同一个文件不会填满你的整个 fileList 数组,并且 Song 类的构造函数实际上使用了你发送给它的文件。另外,检查您用来检查每个文件是否不同的方法是否正常工作。
    【解决方案4】:

    您用来创建Song 对象然后分配给songs 的代码基本上是正确的。你的问题在别处:

    • for 语句几乎肯定是不正确的,数组第一个元素的索引是0,最后一个元素的索引是array.length - 1。您正在从1 迭代到array.length - 2

    • 如果循环中出现 NullPointerException,很可能是因为 fileListnull 或者它包含 null 元素。

    • 如果fileList 数组包含目录、隐藏文件或不匹配的文件,则songs 数组的相应位置将有一个null。这可能是 NullPointerExceptions 的原因...如果您在打印数组条目之前不检查。

    我会注意到这段代码:

    System.out.println(getSong(1).getTitle());
    System.out.println(getSong(4).getTitle());
    

    不会告诉您 Song 对象是相同还是不同。相反,它只会告诉您两个 Song 对象是否具有相同字符的标题。

    这会告诉你 Song 对象是否不同:

    if (getSong(1) != getSong(4)) {
        System.err.println("They are different");
    }
    

    【讨论】:

    • 我添加了另一个过滤器,其中不会将空元素添加到列表中,并且该部分现在可以使用。另外,我更改了 for 循环的限制。谢谢!
    • 感谢代码 sn-p!结果是“他们不一样”
    【解决方案5】:

    我已经更正了这个问题。我的一些类变量是静态的,这导致了在我的数组列表中的每个索引中创建新对象的问题。对于这给任何人造成的任何麻烦,我深表歉意。

    感谢大家的帮助! :]

    【讨论】:

    • 正如我所说,有时你应该从外表寻找解决给定问题的方法:-)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2021-06-14
    相关资源
    最近更新 更多