小编典典

计算catch块中发生的异常数

java

我正在尝试收集所有发生的异常计数和a中的异常名称,ConcurrentHashMap以便我应该知道该异常发生了多少次。

因此,在我的catch块中,我有一个映射,该映射将继续添加异常名称,并且总计数出现。

下面是我which I have modified to always throw SQL Exception每次用于测试目的的代码,以便我可以看到异常计数是否正确。

所以某些情况下

1)如果我将线程10数选择为,将任务数选择为50,则在该图中,我可以看到该特定字符串的500个异常

2)但是,如果我选择的线程40数和任务数一样,500那么20000在该映射中看不到异常,它会显示19000

我的问题是为什么?我在这里做什么错?

class Task implements Runnable {

     public static final AtomicInteger counter_exception = new AtomicInteger(0);
     public static ConcurrentHashMap<String, Integer> exceptionMap = new ConcurrentHashMap<String, Integer>();

     @Override
     public void run() {

     try {

          //Making a db connection and then executing the SQL-

         } catch (SQLException e) {
               exceptionMap.put(e.getCause().toString(), counter_exception.incrementAndGet());
          } catch (Exception e) {

          }
     }

    }

更新:

如果我有类似的内容,我将Null Pointer Exception获得40个线程和4000个任务。为什么?

catch (SQLException e) {

synchronized(this) {
                   exceptionMap.put(e.getCause().toString(), counter_exception.incrementAndGet());
}              
}

阅读 234

收藏
2020-11-30

共1个答案

小编典典

也许正在发生这样的事情:

任务1-500:捕获异常,准备调用exceptionMap.put,从中获取counter_exception.incrementAndGet()传递给所述方法的数字

任务500:安排了原子整数计数器的数字500,因此它exceptionMap.put首先运行

任务1:已安排原子整数计数器的数字1,因此将其exceptionMap.put最后运行

现在,即使计数器为500,并且我们有500个异常,该异常消息仍与1关联,因为该消息是最近执行的。

2020-11-30