在不同的机器上运行JAR的奇怪行为

时间:2016-08-16 09:55:34

标签: java jar

我在我的小型Java应用程序中发现了一个奇怪的(至少对我来说)行为。 我有一个app.jar,它从命令行运行来完成一个简单的任务。任务是,从给定列表中查找重复值并将其删除。该应用程序是使用JDK-7开发的,并与JRE-7一起运行。

从我的电脑的命令行一切正常,但是当在我的Windows-7虚拟机中运行相同的JAR并使用相同的JRE时,它不会删除重复项,也不会发生任何错误。

这是我的代码:

public List<String> removeDuplicatedFin(List<String> coreList,
            Map<String, String> strToRemoveMap) {
        for (int y = 0; y < coreList.size(); y++) {
            String str = coreList.get(y).getPosts().get(0).getMyStr();
            String id = coreList.get(y).getPosts().get(0).getId();
            if (strToRemoveMap.get(str) != null
                    && strToRemoveMap.get(str).equals(idPost)) {
                coreList.get(y).getPosts().remove(0);
            }
        }
        return coreList;
    }

coreList是主要列表

strToRemoveMap包含要删除的值

有任何想法或一些帮助吗?

提前致谢

2 个答案:

答案 0 :(得分:0)

非常感谢你的回复。最后我发现这种异常发生是因为我将两个字符串与示例进行比较

if(str1.equals(str2))

我不知道为什么我改变了

if(str1 == str2) 

它完美无缺。但是在Eclipse和我的PC中它也使用了equals()。

我需要更多地了解这类事情而不仅仅是。

谢谢你,祝你有个愉快的一天。

答案 1 :(得分:0)

与您可能发现的相反,在Java中比较两个字符串的正确方法是使用String.equals;参见How do I compare strings in Java?

在某些情况下,str1 == str2false,而str1.equals(str2)true。两个相等的字符串不一定是同一对象。

但是,str1 == str2不能为true,而str1.equals(str2)不能为falseString.equals的规范不允许这样做。

如果您确实遇到了似乎的情况,那么最可能的解释是您患有种族状况或由以下原因引起的记忆异常另一个线程的行为。如果看不到实际的代码,那么很难更具体些。

这也可以解释为什么您的(实际)代码在某些情况下有效,而在其他情况下则无效。与并发相关的错误仅在某些平台上出现并不罕见。例如,它们可能取决于操作系统,或者取决于Java版本,或者取决于系统所具有的物理核心数量。


对于它的价值,您的(假定的)示例方法无法编译。由于coreListList<String>,因此coreList.get(y)将给您String。但是String并未声明getPosts()方法,因此您拥有coreList.get(y).getPosts()的三个地方将是编译错误。

我怀疑您已经修改了显示问题的实际代码。但是这样做,您已将其变成荒谬的事情。这就是为什么我们要求提供minimal reproducible example