【问题标题】:Catch exception thrown by library in another thread (android)在另一个线程中捕获库引发的异常(android)
【发布时间】:2018-12-18 21:41:23
【问题描述】:

我使用的库有时(大约 100 次中的 1 次)会抛出 ConcurrentModificationException 导致应用崩溃。

堆栈跟踪没有提到我的任何代码,而是提到了库的代码。 我试图捕捉我调用库的异常,但它不起作用。

我猜异常是在库中的一个新线程中引发的。

我怎样才能捕捉到这样的异常?

库: 旧的飞利浦 Hue Java 库。 (我很快就要换新的了。)

例外:

E/AndroidRuntime: FATAL EXCEPTION: Thread-21319
    Process: my.package, PID: 21561
    Theme: themes:{...}
    java.util.ConcurrentModificationException
        at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
        at com.philips.lighting.hue.sdk.notification.impl.PHNotificationManagerImpl$3.onReceived(PHNotificationManagerImpl.java:180)
        at com.philips.lighting.hue.sdk.notification.impl.PHHueResultReceiver.execute(PHHueResultReceiver.java:24)
        at com.philips.lighting.hue.sdk.notification.impl.PHNotificationManagerImpl.notifyBridgeSearchResult(PHNotificationManagerImpl.java:188)
        at com.philips.lighting.hue.sdk.upnp.PHBridgeSearchManagerImpl$1.run(PHBridgeSearchManagerImpl.java:198)

【问题讨论】:

  • 您应该添加更多信息,例如堆栈跟踪和您正在使用的库。
  • 堆栈跟踪已添加。但是,我只想知道是否可以选择捕获此类异常。
  • 我可能错了,但我不这么认为。因为它不是你的线程,所以你不能真正将它包裹在任何try/catch 中。也许你可以做些别的事情,但我不这么认为。我会更多地查看图书馆,看看这是否常见。你碰巧控制线程何时被触发吗?如果是这样,也许你可以防止这种情况发生。
  • 您是否有机会将线程安全集合传递给库(请参阅此答案stackoverflow.com/questions/11360401/java-synchronized-list)?正如其他人所说,我不相信您可以处理其他线程中引发的异常。
  • 这个库真的很糟糕,我很快就会切换到另一个。我无法控制与线程有关的任何事情。它们是在库中的某处创建的。

标签: java android exception


【解决方案1】:

我猜你在迭代时修改了数组值。

Java Collection 类是快速失败的,这意味着如果 Collection 当某些线程使用遍历它时将被更改 迭代器,iterator.next() 将抛出 ConcurrentModificationException。

这里是如何避免它: How to avoid java.util.ConcurrentModificationException when iterating through and removing elements from an ArrayList

【讨论】:

  • 他没有遍历任何数组,他使用的库是问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 2013-11-15
  • 2011-06-25
  • 1970-01-01
相关资源
最近更新 更多