Java:无一例外地崩溃

Java : Crash without exception

提问人:Xiidref 提问时间:10/1/2022 最后编辑:Xiidref 更新时间:10/7/2022 访问量:88

问:

我正在尝试调试一些看起来像这样的代码:

class MyClass {
    public void myMethod(HashMap<String, String> inputMap) {
        try {
            ConcurrentHashMap<String, String> cm = new ConcurrentHashMap<>();
            cm.putAll(inputMap);
            
            try {
                for (Object key : cm.keySet()) {
                    cm.put(key.toString(), "");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }


            System.out.println("After try catch");            

        } finally {
            System.out.println("In finally");
        }
    }
}

通过使用 InteliJ 中的调试器,我发现这段代码在循环线上存在问题。for

  • 执行从 for 循环传递到子句,而不传入子句,也不传入 .finallycatchtry/catch

  • 该对象不是空的(其中大约有 30 个元素)。cm

  • 我正在使用 java 7,给System.getProperty("java.version")1.7.0_85

  • 当我尝试从 InteliJ 调试器调用 mnually 时,出现以下错误消息。但是当我查看 ConcurentHashMap 类的 javadoc 时,这个方法应该存在。cm.keySet()No such instance method: 'keySet'

  • 当我运行时,我在方法列表中看到了该方法。cm.getClass().getDeclaredMethods()public java.util.Set java.util.concurrent.ConcurrentHashMap.keySet()

  • 此代码未在主线程上运行。

  • 这不会在控制台中显示任何错误消息,我无法捕获异常。

有谁知道那里可能有什么问题?我已经尝试了我能想到的一切,但我别无选择。

编辑问题已修复问题甚至不在于代码本身,而是编译器从 java 7 更新到 java 8,而我没有注意到,并且在编译过程中没有崩溃,而我在服务器上使用的 java 版本是 java 7。由于我无法更改编译器版本和服务器上的版本,因此我以另一种方式重写了代码,以便它可以在两个版本上工作。 它给出了这样的东西:


class MyClass {
    public void myMethod(HashMap<String, String> inputMap) {
        try {
            ConcurrentHashMap<String, String> cm = new ConcurrentHashMap<>();
            cm.putAll(inputMap);
            
            try {
                Enumeration<String> keys = cm.keys();
                while(keys.hasMoreElements()) {
                    String key = keys.nextElement();
                    cm.put(key, "");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }


            System.out.println("After try catch");            

        } finally {
            System.out.println("In finally");
        }
    }
}

Ps:谢谢你,@cyberbrain,如果没有你关于捕捉 Throwable 而不是 Exception 的建议,我不会弄清楚这一点。

java 调试 异常 concurrenthashmap

评论

0赞 cyberbrain 10/1/2022
也许你得到一个错误 - 尝试捕捉一个而不是一个异常。我猜(!)当你遍历地图的键集并同时尝试操作相同的地图时,你会遇到问题。Throwable
0赞 Xiidref 10/1/2022
我会尝试我没有想到 Throwable。
0赞 PeterMmm 10/1/2022
在 JDK 1.7.0_80 中运行良好。
0赞 PeterMmm 10/1/2022
This don't display any error message,这几乎是不可能的。如果存在错误,JVM 总是会打印一些错误。您可能正在调试与 IDE 中的代码不同步的代码。

答:

1赞 Orfeas Magoulas 10/1/2022 #1

尝试替换为ObjectString

class MyClass {
    public void myMethod(HashMap<String, String> inputMap) {
        try {
            ConcurrentHashMap<String, String> cm = new ConcurrentHashMap<>(inputMap);

            try {
                for (String key : cm.keySet()) {
                    cm.put(key, "");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }


            System.out.println("After try catch");

        } finally {
            System.out.println("In finally");
        }
    }
}

您还可以将整个 for 循环替换为以下内容:

cm.replaceAll((k, v) -> "");

编辑:意识到 lamdas 在 JDK 1.7 上不起作用

评论

1赞 PeterMmm 10/1/2022
JDK 1.7 中没有 lambda
0赞 Orfeas Magoulas 10/1/2022
好抓,忘了!
0赞 Xiidref 10/7/2022
我已经纠正了这一点,但这不是问题所在