2017-04-16 79 views
1

時,我有代碼片段:獲取的RuntimeException甚至有嘗試捕捉

try {     
    AlgorithmParameterSpec spec = null; 
     synchronized (lock) { 
     // ... 
     KeyPairGenerator generator = KeyPairGenerator.getInstance(RSA_ALGORITHM, PROVIDER_ANDROID_KEY_STORE); 
     generator.initialize(spec); 
     generator.generateKeyPair();     
     } 
     } catch (Throwable e) { 
      Logger.e("Exception " + e.getMessage() + " occurred",e); 
     } 

在有SDK版本< 23器件我行generator.generateKeyPair();與應用崩潰得到java.security.ProviderException

我的問題是:爲什麼如果我有try/catch應用程序崩潰?

從這樣的回答:Why we don't have to add try-catch to a RuntimeException?

這是因爲它是一個未經檢查的異常。它不需要顯式聲明或捕獲 。另請參閱 主題上的Sun教程。

,但我不認爲它我的情況

我的堆棧跟蹤:

8:28:39.700 9359-10032/com.hoo.app.dev E/art: JNI DETECTED ERROR IN APPLICATION: JNI FindClass called with pending exception 'java.security.ProviderException' thrown in unknown throw location 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: in call to FindClass 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: from byte[] com.google.android.gms.org.conscrypt.NativeCrypto.EVP_DigestSignFinal(com.google.android.gms.org.conscrypt.NativeRef$EVP_MD_CTX) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: "pool-7-thread-1" prio=5 tid=66 Runnable 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: | group="main" sCount=0 dsCount=0 obj=0x12da8400 self=0x7f87147800 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: | sysTid=10032 nice=0 cgrp=default sched=0/0 handle=0x7f9206a000 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: | state=R schedstat=(60197617 2542383 67) utm=6 stm=0 core=1 HZ=100 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: | stack=0x7f646fe000-0x7f64700000 stackSize=1036KB 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: | held mutexes= "mutator lock"(shared held) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at com.google.android.gms.org.conscrypt.NativeCrypto.EVP_DigestSignFinal(Native method) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at com.google.android.gms.org.conscrypt.OpenSSLSignature.engineSign(:com.google.android.gms:224) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at java.security.Signature$SignatureImpl.engineSign(Signature.java:672) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at java.security.Signature.sign(Signature.java:381) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at com.android.org.bouncycastle.x509.X509Util.calculateSignature(X509Util.java:248) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at com.android.org.bouncycastle.x509.X509V3CertificateGenerator.generate(X509V3CertificateGenerator.java:434) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at com.android.org.bouncycastle.x509.X509V3CertificateGenerator.generate(X509V3CertificateGenerator.java:412) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at android.security.AndroidKeyPairGenerator.generateKeyPair(AndroidKeyPairGenerator.java:133) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at java.security.KeyPairGenerator$KeyPairGeneratorImpl.generateKeyPair(KeyPairGenerator.java:276) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at com.myprog.MyKeystoreWrapper.createKey(SourceFile:147) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: - locked <0x2b1e5aea> (a java.lang.Object) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at com.myprog.MyKeystoreWrapper.createFirstInstallData(SourceFile:70) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at com.myprog.MyProgLib.getReInstallData(SourceFile:675) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at com.myprog.MyProgLib.sendTrackingWithEvent(SourceFile:1110) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at com.myprog.MyProgLib.access$600(SourceFile:72) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at com.myprog.MyProgLib$d.run(SourceFile:2253) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
01-13 18:28:39.700 9359-10032/com.hoo.app.dev E/art: at java.lang.Thread.run(Thread.java:818) 

線:com.myprog.MyKeystoreWrapper.createKey(SourceFile:147)點我的方法

+0

發佈完整堆棧跟蹤 – njzk2

+0

在99.9999%的時間內,Java應用程序不會崩潰。 Java應用程序往往會拋出異常。從你的文章中你不清楚你是如何知道你在這一行上得到這個異常的,但是你似乎成功地捕捉到異常,這可能是你知道的。所以,無論你認爲「崩潰」是什麼,你沒有告訴我們,我們一無所知。請更確切地說明發生了什麼,以及您知道(或者您認爲自己知道)發生了什麼。 –

+0

之後可能會有其他事情崩潰。 – EpicPandaForce

回答

2

java.security.ProviderException:

提供者異常的運行時異常(例如m isconfiguration 錯誤或不可恢復的內部錯誤),這可能會被 提供程序分類以提供特定的,特定於提供程序的運行時錯誤。

其中包括:不可恢復的內部錯誤
在這種情況下,這意味着捕獲異常是無用的,因爲錯誤會停止應用程序。
你可能在這種情況下。


在與SDK版本的設備< 23我行generator.generateKeyPair得到java.security.ProviderException ();和應用程序崩潰!

如果這個錯誤是無法解析與SDK版本< 23設備,您應該測試代碼中的SDK版本和應用替代這個保護任務。

+0

添加堆棧跟蹤 – snaggs

1

正如您的研究所述,未經檢查的異常不需要顯式聲明。如果編譯器無法確定是否會發生運行時異常,則會發生未經檢查的異常。

正如這篇文章解釋說:How to catch an Exception from a thread

我認爲,在一個單獨的線程中發生異常,因此你無法與你周圍的catch子句抓住它。與大多數選票(丹克魯茲)後採用下面的方法是通過Thread類暴露:

setUncaughtExceptionHandler(ThreadExceptionHandler)

利用該解決方案由用戶丹克魯茲的建議,我會認爲你能捕捉所述運行時異常。