如何处理super.onCreate中的异常?

问题描述:

有没有安全的方法来处理super.onCreate(savedInstanceState)引发的异常?如何处理super.onCreate中的异常?

我的用户非常少数达不到这个错误

java.lang.NoClassDefFoundError - android.security.MessageDigest 

原因在this question讨论,但基本上onCreate为MapActivity类都可以抛出NoClassDefFoundError。我担心事先检测到这种情况可能不是未来的证明。

我认为我的班级(它扩展了MapActivity)的最安全的解决方案是赶上NoClassDefFoundError并改为启动Google地图的网址,例如,

try {    
     super.onCreate(savedInstanceState); 
    } catch (NoClassDefFoundError err) { 
     StringBuilder url = new StringBuilder(
       "http://maps.google.com/maps?q=").append(latitude) 
       .append(",").append(longitude).append("&z=18"); 

     Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url.toString())); 
     startActivity(i); 
     finish(); 
     return; 
    } 

不过,我担心我的代码将与SuperNotCalledExceptionNoClassDefFoundError发生崩溃。

有没有一种安全的方式来处理super.onCreate调用中的异常/错误?

MapActivity已被弃用,支持MapFragment,它是Google Play Services的一部分。我认为这个新的API是向后兼容的。

我建议你事先检测MapActivity。这将是未来的保证,因为MapActivity API不会改变。 MapFragment API需要Google Play服务APK;该文档向您显示如何验证它是否存在,如果不存在则提示用户。该APK可从Google Play商店购买,并由OTA提供。

+0

“这个新API向后兼容,我认为” - 抱歉,但没有。 – CommonsWare 2013-03-14 23:19:25

+0

我不认为检测MapActivity会有帮助 - 设备具有MapActivity类,但在实例化时会引发错误。我想我需要检测已安装的Google地图应用的版本,并检查它是否适用于此设备(例如,通过检查相应的MessageDigest类)。 – 2013-03-14 23:45:44

我的用户非常少数达不到这个错误

他们是运行谷歌地图子系统的盗版用户。 Google地图在所有版本的Android上都能正常工作,并且许可证持有者将获得正确的版本。然而,精神上受到挑战的海盗有时会在较新的设备上使用旧版盗版地图二进制文件,导致此问题。

但是,我担心我的代码会在发生NoClassDefFoundError时发生SuperNotCalledException异常。

有一个很好的机会,这的确会的情况下,或其他一些例外,如startActivity()可能因为缺少super.onCreate()的崩溃。所以可能finish(),就此而言。不过,欢迎您尝试。

有没有一种安全的方式来处理super.onCreate调用中的异常/错误?

不一般。