【问题标题】:Exception thrown inside a synchronized block java/android在同步块 java/android 内抛出异常
【发布时间】:2014-04-22 21:38:56
【问题描述】:

我在同步块方面遇到了一些奇怪的事情。我有一个需要在同步块内的缓存。块内部发生异常,由于某种原因不会进入 catch 块。我尝试调试它,我看到它调用了 InvocationTargetException 构造函数,然后它转到了 ThreadGroup uncaughtException(Thread t, Throwable e) 方法。

我在同步块周围有一个 try-catch,实际上还有另一个内部 try-catch 覆盖了发生异常的代码行...

有谁知道为什么它没有到达 catch 块?

我什至尝试从字面上尝试捕获 InvocationTargetException 以及异常,但正如预期的那样,它无法编译,因为内部没有任何东西抛出这种异常。我确实理解异常的原因,但我担心它没有被捕获并杀死线程。

@Override
public void onLocationChanged(Location loc) 
{
    if(lastKnownLatitude != null && lastKnownLongitude != null)
    {
            try
            {

                synchronized (dataManager.getRegisteredGeo()) {for(String geoName : dataManager.getRegisteredGeo().keySet())
                    {
                        GeoNotification geoNotification = dataManager.getRegisteredGeo().get(geoName);
                        boolean isInside = geoNotification.isLocationInsideFence(loc.getLatitude(), loc.getLongitude());


                        geoNotification.setLastKnownDeviceInside(isInside);
                        GeoUpdateMsg updateMsg = new GeoUpdateMsg(geoNotification.getTransactionId());
                        updateMsg.sendData(updateMsg.serializeObjectIntoXml());

                    }   
                }
            }
            catch(Exception e)
            {
                Logger.LogError("Exception while processing  geo notifications" + e.getMessage());
            }
    }
}

这是在设备位置更改时触发的事件

这是我从日志猫那里得到的,异常没有被捕获

04-22 13:12:35.762: E/AndroidRuntime(2121): FATAL EXCEPTION: main
04-22 13:12:35.762: E/AndroidRuntime(2121): java.lang.NoClassDefFoundError: org/joda/convert/FromString
04-22 13:12:35.762: E/AndroidRuntime(2121):     at java.lang.reflect.Method.getDeclaredAnnotations(Native Method)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at java.lang.reflect.Method.getDeclaredAnnotations(Method.java:267)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.MethodDetail.<init>(MethodDetail.java:57)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.DetailScanner.methods(DetailScanner.java:411)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.DetailScanner.scan(DetailScanner.java:366)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.DetailScanner.<init>(DetailScanner.java:140)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.DetailExtractor.getDetail(DetailExtractor.java:107)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Support.getDetail(Support.java:278)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Support.getDetail(Support.java:271)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.ScannerFactory.getInstance(ScannerFactory.java:76)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Support.getScanner(Support.java:357)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Source.getScanner(Source.java:271)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Source.getCaller(Source.java:300)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Composite.writeReplace(Composite.java:1147)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Composite.writeUnion(Composite.java:1124)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Composite.writeElements(Composite.java:1098)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Composite.writeSection(Composite.java:1004)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Composite.write(Composite.java:975)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Composite.write(Composite.java:952)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Traverser.write(Traverser.java:236)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Traverser.write(Traverser.java:208)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Traverser.write(Traverser.java:186)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Persister.write(Persister.java:1180)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Persister.write(Persister.java:1162)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Persister.write(Persister.java:1140)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Persister.write(Persister.java:1259)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Persister.write(Persister.java:1241)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at org.simpleframework.xml.core.Persister.write(Persister.java:1222)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at com.medusa.client.transactions.TransactionsGoingOut.serializeObjectIntoXml(TransactionsGoingOut.java:57)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at com.medusa.client.transactions.messages.GeoFenceUpdateMsg.serializeObjectIntoXml(GeoFenceUpdateMsg.java:64)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at com.medusa.client.smsIntercept.GPSTracker.onLocationChanged(GPSTracker.java:312)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:255)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:184)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:200)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at android.os.Looper.loop(Looper.java:137)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at android.app.ActivityThread.main(ActivityThread.java:5041)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at java.lang.reflect.Method.invokeNative(Native Method)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at java.lang.reflect.Method.invoke(Method.java:511)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at dalvik.system.NativeStart.main(Native Method)
04-22 13:12:35.762: E/AndroidRuntime(2121): Caused by: java.lang.ClassNotFoundException: Didn't find class "org.joda.convert.FromString" on path: /data/app/com.nomotion.smsIntercept-1.apk
04-22 13:12:35.762: E/AndroidRuntime(2121):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:65)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
04-22 13:12:35.762: E/AndroidRuntime(2121):     at java.lang.ClassLoader.loadClass(ClassLoader.java:461)

【问题讨论】:

  • 在这里发布你的代码!!
  • 你能显示错误的堆栈跟踪吗?
  • 我怀疑 Exception 没有在您显示的 try 句子中抛出,但堆栈跟踪会澄清这一点。
  • 只是这个类不被识别org.joda.convert.FromString确保你正确集成你的库或者你没有多次引用同一个库
  • 是的。我的意思是我理解这个问题,但它应该已经被抓住了......

标签: java android


【解决方案1】:

也许异常没有被捕获,因为它是 Error 而不是 Exception

仅出于调试目的:尝试将“catch Exception”更改为“catch Throwable”,您将获得有关问题的更多信息。

有关可能的解决方案:请参阅您帖子的 cmets。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2015-08-20
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    相关资源
    最近更新 更多