提问人:Xiidref 提问时间:10/1/2022 最后编辑:Xiidref 更新时间:10/7/2022 访问量:88
Java:无一例外地崩溃
Java : Crash without exception
问:
我正在尝试调试一些看起来像这样的代码:
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 循环传递到子句,而不传入子句,也不传入 .
finally
catch
try/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 的建议,我不会弄清楚这一点。
答:
尝试替换为Object
String
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 上不起作用
评论
Throwable
This don't display any error message
,这几乎是不可能的。如果存在错误,JVM 总是会打印一些错误。您可能正在调试与 IDE 中的代码不同步的代码。