我在" String name =(String)keys.next();"得到了ConcurrentModificationException。当我在多线程中运行java代码时。导致错误的函数部分如下:
if (inputStr == null)
return null;
String tempStr = new String(inputStr);
Properties props = System.getProperties();
Iterator keys = props.keySet().iterator();
while (keys.hasNext()) {
String name = (String) keys.next();
String value = props.getProperty(name);
//Build a pattern and compile it
String patternStr = "%" + name + "%";
Pattern pattern = Pattern.compile(patternStr);
// Replace all occurrences of pattern in input string
Matcher matcher = pattern.matcher(tempStr);
tempStr = matcher.replaceAll(value);
}
堆栈跟踪详细信息如下:
引起:java.util.ConcurrentModificationException at java.util.Hashtable $ Enumerator.next(未知来源)at com.pb.common.util.ResourceUtil.replaceWithSystemPropertyValues(ResourceUtil.java:350) 在 com.pb.common.calculator.ControlFileReader.searchAndReplaceWithEnv(ControlFileReader.java:610) 在 com.pb.common.calculator.ControlFileReader.readMatrixDataEntries(ControlFileReader.java:493) 在 com.pb.common.calculator.ControlFileReader。(ControlFileReader.java:109) 在 misc.UtilityExpressionCalculator。(UtilityExpressionCalculator.java:191) 在 misc.AbstractChoiceHandler.createUtilityExpressionCalculator(AbstractChoiceHandler.java:84) at logSumCalculator.ModeChoiceModel。(ModeChoiceModel.java:41) at logSumCalculator.ModeChoiceTask.run(ModeChoiceTask.java:59)
是否有关于迭代键的问题?
答案 0 :(得分:2)
请参阅HashTable的javadoc:
如果在创建迭代器之后的任何时候对Hashtable进行结构修改,除非通过迭代器自己的remove方法,迭代器将抛出ConcurrentModificationException。
您可能正在另一个帖子中setProperty
上调用System.getProperties()
。
答案 1 :(得分:2)
迭代时需要同步属性:
Properties props = System.getProperties();
synchronized(props) {
// do work here ...
}
答案 2 :(得分:0)
在对集合进行迭代或枚举时,无法修改键/内容。
为要修改的元素创建临时拥有者,然后使用它来进行更改。