當前位置:首頁 » 安卓系統 » android中異常

android中異常

發布時間: 2023-02-13 05:27:26

A. Android 中的異常處理

異常發生時,如果沒有一個異常處理器來處理這個異常,程序會被中止。在 JVM 當中有一個預先定義好的異常處理層次結構。

結構中的第一層是 catch 塊。

如果第一個 catch 塊無法處理這個異常,異常便會被傳遞給下面的 catch 塊。如果所有的 catch 塊都無法處理某個異常,該異常便會交由當前線程的 UncaughtExceptionHandler 來處理。 UncaughtExceptionHandler 是個只有一個方法的介面。

UncaughtExceptionHandler 可以調協在當前線程里,未被 catch 塊捕獲的異常處理流程會先來到這里;還可以設置在 ThreadGroup 當中,當前線程的 UncaughtExceptionHandler 無法處理的異常會在這里被處理。如果 ThreadGroup 的 UncaughtExceptionHandler 還是無法處理該異常,那麼最終將會被交由默認異常處理程序 ( default uncaught exception handler ) 處理,也就是列印出異常棧,並終止程序。當然你也可以覆蓋這種行為:

B. 安卓手機的應用簽名異常怎麼恢復

出現簽名異常是由於反復安裝軟體所導致的簽名不一致,需要卸載並重新安裝該軟體,操作方法如下:

1、首先長按該軟體的圖標,然後點擊軟體圖標左上角的叉號進行軟體的卸載。



C. 安卓常見異常

java中異常機制的一些概念。寫本文的目的在於方便我很長時間後若是忘了這些東西可以通過這篇文章迅速回憶起來。
1. 異常機制
1.1 異常機制是指當程序出現錯誤後,程序如何處理。具體來說,異常機制提供了程序退出的安全通道。當出現錯誤後,程序執行的流程發生改變,程序的控制權轉移到異常處理器。
1.2 傳統的處理異常的辦法是,函數返回一個特殊的結果來表示出現異常(通常這個特殊結果是大家約定俗稱的),調用該函數的程序負責檢查並分析函數返回的結果。這樣做有如下的弊端:例如函數返回-1代表出現異常,但是如果函數確實要返回-1這個正確的值時就會出現混淆;可讀性降低,將程序代碼與處理異常的代碼混爹在一起;由調用函數的程序來分析錯誤,這就要求客戶程序員對庫函數有很深的了解。
1.3 異常處理的流程
1.3.1 遇到錯誤,方法立即結束,並不返回一個值;同時,拋出一個異常對象
1.3.2 調用該方法的程序也不會繼續執行下去,而是搜索一個可以處理該異常的異常處理器,並執行其中的代碼
2 異常的分類
2.1 異常的分類
2.1.1 異常的繼承結構:基類為Throwable,Error和Exception繼承Throwable,RuntimeException和 IOException等繼承Exception,具體的RuntimeException繼承RuntimeException。
2.1.2 Error和RuntimeException及其子類成為未檢查異常(unchecked),其它異常成為已檢查異常(checked)。
2.2 每個類型的異常的特點
2.2.1 Error體系 Error類體系描述了Java運行系統中的內部錯誤以及資源耗盡的情形。應用程序不應該拋出這種類型的對象(一般是由虛擬機拋出)。如果出現這種錯誤,除了盡力使程序安全退出外,在其他方面是無能為力的。所以,在進行程序設計時,應該更關注Exception體系。
2.2.2 Exception體系 Exception體系包括RuntimeException體系和其他非RuntimeException的體系
2.2.2.1 RuntimeException RuntimeException體系包括錯誤的類型轉換、數組越界訪問和試圖訪問空指針等等。處理RuntimeException的原則是:如果出現 RuntimeException,那麼一定是程序員的錯誤。例如,可以通過檢查數組下標和數組邊界來避免數組越界訪問異常。
2.2.2.2 其他(IOException等等)這類異常一般是外部錯誤,例如試圖從文件尾後讀取數據等,這並不是程序本身的錯誤,而是在應用環境中出現的外部錯誤。
2.3 與C++異常分類的不同
2.3.1 其實,Java中RuntimeException這個類名起的並不恰當,因為任何異常都是運行時出現的。(在編譯時出現的錯誤並不是異常,換句話說,異常就是為了解決程序運行時出現的的錯誤)。
2.3.2 C++中logic_error與Java中的RuntimeException是等價的,而runtime_error與Java中非RuntimeException類型的異常是等價的。
3 異常的使用方法
3.1 聲明方法拋出異常
3.1.1 語法:throws(略)
3.1.2 為什麼要聲明方法拋出異常?方法是否拋出異常與方法返回值的類型一樣重要。假設方法拋出異常確沒有聲明該方法將拋出異常,那麼客戶程序員可以調用這個方法而且不用編寫處理異常的代碼。那麼,一旦出現異常,那麼這個異常就沒有合適的異常控制器來解決。
3.1.3 為什麼拋出的異常一定是已檢查異常? RuntimeException與Error可以在任何代碼中產生,它們不需要由程序員顯示的拋出,一旦出現錯誤,那麼相應的異常會被自動拋出。而已檢查異常是由程序員拋出的,這分為兩種情況:客戶程序員調用會拋出異常的庫函數(庫函數的異常由庫程序員拋出);客戶程序員自己使用throw語句拋出異常。遇到Error,程序員一般是無能為力的;遇到RuntimeException,那麼一定是程序存在邏輯錯誤,要對程序進行修改(相當於調試的一種方法);只有已檢查異常才是程序員所關心的,程序應該且僅應該拋出或處理已檢查異常。
3.1.4 注意:覆蓋父類某方法的子類方法不能拋出比父類方法更多的異常,所以,有時設計父類的方法時會聲明拋出異常,但實際的實現方法的代碼卻並不拋出異常,這樣做的目的就是為了方便子類方法覆蓋父類方法時可以拋出異常。
3.2 如何拋出異常
3.2.1 語法:throw(略)
3.2.2 拋出什麼異常?對於一個異常對象,真正有用的信息時異常的對象類型,而異常對象本身毫無意義。比如一個異常對象的類型是 ClassCastException,那麼這個類名就是唯一有用的信息。所以,在選擇拋出什麼異常時,最關鍵的就是選擇異常的類名能夠明確說明異常情況的類。
3.2.3 異常對象通常有兩種構造函數:一種是無參數的構造函數;另一種是帶一個字元串的構造函數,這個字元串將作為這個異常對象除了類型名以外的額外說明。
3.2.4 創建自己的異常:當Java內置的異常都不能明確的說明異常情況的時候,需要創建自己的異常。需要注意的是,唯一有用的就是類型名這個信息,所以不要在異常類的設計上花費精力。
3.3 捕獲異常如果一個異常沒有被處理,那麼,對於一個非圖形界面的程序而言,該程序會被中止並輸出異常信息;對於一個圖形界面程序,也會輸出異常的信息,但是程序並不中止,而是返回用戶界面處理循環中。
3.3.1 語法:try、catch和finally(略)控制器模塊必須緊接在try塊後面。若擲出一個異常,異常控制機制會搜尋參數與異常類型相符的第一個控制器隨後它會進入那個catch 從句,並認為異常已得到控制。一旦catch 從句結束對控制器的搜索也會停止。 3.3.1.1 捕獲多個異常(注意語法與捕獲的順序)(略)
3.3.1.2 finally的用法與異常處理流程(略)
3.3.2 異常處理做什麼?對於Java來說,由於有了垃圾收集,所以異常處理並不需要回收內存。但是依然有一些資源需要程序員來收集,比如文件、網路連接和圖片等資源。
3.3.3 應該聲明方法拋出異常還是在方法中捕獲異常?原則:捕捉並處理哪些知道如何處理的異常,而傳遞哪些不知道如何處理的異常
3.3.4 再次拋出異常
3.3.4.1 為什麼要再次拋出異常?在本級中,只能處理一部分內容,有些處理需要在更高一級的環境中完成,所以應該再次拋出異常。這樣可以使每級的異常處理器處理它能夠處理的異常。
3.3.4.2 異常處理流程對應與同一try塊的catch塊將被忽略,拋出的異常將進入更高的一級。
4 關於異常的其他問題
4.1 過度使用異常首先,使用異常很方便,所以程序員一般不再願意編寫處理錯誤的代碼,而僅僅是簡簡單單的拋出一個異常。這樣做是不對的,對於完全已知的錯誤,應該編寫處理這種錯誤的代碼,增加程序的魯棒性。另外,異常機制的效率很差。
4.2 將異常與普通錯誤區分開對於普通的完全一致的錯誤,應該編寫處理這種錯誤的代碼,增加程序的魯棒性。只有外部的不能確定和預知的運行時錯誤才需要使用異常。
4.3 異常對象中包含的信息一般情況下,異常對象唯一有用的信息就是類型信息。但使用異常帶字元串的構造函數時,這個字元串還可以作為額外的信息。調用異常對象的getMessage()、toString()或者printStackTrace()方法可以分別得到異常對象的額外信息、類名和調用堆棧的信息。並且後一種包含的信息是前一種的超集。

D. Android實現錄屏MediaProjection以及相關異常解決

需要實現一個手機的錄屏功能,於是從網上找了些相關資料和源碼,發現跑不起來,於是開始bug,發現坑還是很多的,這里記錄一下實現過程和一些些遇到的異常以及一個我調整完可以跑的Demo。

首先在AndroidManifest中靜態配置許可權:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
然後在Activity中動態申請

if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_REQUEST_CODE);
}

if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECORD_AUDIO)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[] {Manifest.permission.RECORD_AUDIO}, AUDIO_REQUEST_CODE);
}
因為項目中需要用到一個自定義的Application,所以要需要配置一個全局的Application,同樣在AndroidManiest中在application添加自定義的類名,如果在裡面啟動服務了也要一並配置。

<application
android:name=".RecordApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

</application>
然後可以使用封裝好的實現其錄屏功能的service,這個封裝類是網上找的,看很多人在用,我解決了一些異常,並根據自己需求修改了一下。

其中主要異常有:

1.mediaRecorder報空指針,解決方案,在聲明的時候聲明為靜態

private static MediaRecorder mediaRecorder;
2.mediaRecorder.start()方法異常,在每次調用stop時要先調用

mediaRecorder.stop();
mediaRecorder.release();
兩個方法,並將

mediaRecorder = null。

mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC)異常,這里是設置音頻源,可嘗試將參數改為
MediaRecorder.AudioSource.DEFAULT
4.stop方法異常,如果是running狀態不正常,可能是其狀態丟失,需要將聲明的running也改為靜態的

0.增加需求,在生成視頻時大部分人都會根據mediaRecorder.setVideoSize(width, height);方法來定死視頻大小,導致一些手機會解析不了,或者是視頻比屏幕小,這里提供一種根據屏幕大小動態設置視頻大小的方法。

這里就要用到我們之前定義的全局的Application,然後調用getInstance()獲取其實例,

然後通過

DisplayMetrics dm = RecordApplication.getInstance().getResources().getDisplayMetrics();
private int width = dm.widthPixels;
private int height = dm.heightPixels;
private int dpi = dm.densityDpi;
來獲取屏幕的長、寬和dpi的值,這里不用WindowsManager方法是因為我是在非Activity去獲取屏幕長寬的,所以用了getDisplayMetrics();

這樣這個功能基本就是實現了。
Demo地址: https://github.com/han103070/Screencap

E. Android開發常見異常與錯誤系列(一)

一、前言

這系列文章是自己在平時開發過程中遇到的問題。之前只是記在雲筆記上面,現在整理一下,發出來共享。

ps:像那些什麼沒有注冊Activity呀,許可權呀等最基本的就不再贅述。

二、ADB連接異常

有時我們發現,即使自己從任務管理器裡面把adb.exe給幹掉了,但還是不行,這時,你就可以嘗試以下操作:

[2014-07-30 17:09:11 - QtActivity] The connection to adb is down, and a severe error has occured.

[2014-07-30 17:09:11 - QtActivity] You must restart adb and Eclipse.

[2014-07-30 17:09:11 - QtActivity] Please ensure that adb is correctly located at 『D:\InstallFile\AndroidDevelop\ADT\sdk\platform-tools\adb.exe』 and can be executed.

adb起動失敗:

1,殺掉其它的adb.exe看,如果不行,

2,看sdk\tools路徑下面有沒有

hprof-conv.exe

如果有,則把它復制到sdk\platform_tools下

3,如果沒有,剛看sdk\platform_tools下有沒有

hprof-conv.exe

如果有,剛復制到tools下。

4,如果兩者都沒有,剛下一個

hprof-conv.exe

三、java.lang.IllegalStateException: Activity has been destroyed

這個異常在切換Fragment中比較容易出現,稍不注意就會出現如下異常:

FATAL EXCEPTION: main12-0909:20:14.689: E/AndroidRuntime(31223): java.lang.IllegalStateException: Activity has been destroyed12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1365)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)12-0909:20:14.689: E/AndroidRuntime(31223): at cn.com.topsky.community.tfd.DongTaiFragment.init(DongTaiFragment.java:209)12-0909:20:14.689: E/AndroidRuntime(31223): at cn.com.topsky.community.tfd.DongTaiFragment.onCreateView(DongTaiFragment.java:68)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)12-0909:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)12-0909:20:14.689: E/AndroidRuntime(31223): at android.os.Handler.handleCallback(Handler.java:605)12-0909:20:14.689: E/AndroidRuntime(31223): at android.os.Handler.dispatchMessage(Handler.java:92)12-0909:20:14.689: E/AndroidRuntime(31223): at android.os.Looper.loop(Looper.java:154)12-0909:20:14.689: E/AndroidRuntime(31223): at android.app.ActivityThread.main(ActivityThread.java:4624)12-0909:20:14.689: E/AndroidRuntime(31223): at java.lang.reflect.Method.invokeNative(Native Method)12-0909:20:14.689: E/AndroidRuntime(31223): at java.lang.reflect.Method.invoke(Method.java:511)12-0909:20:14.689: E/AndroidRuntime(31223): atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)12-0909:20:14.689: E/AndroidRuntime(31223): atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)12-0909:20:14.689: E/AndroidRuntime(31223): at dalvik.system.NativeStart.main(Native Method)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

經查,說這個是當前android-support-v4版本的一個bug,因為在當fragment進行到detached狀態時,它會重置它的內部狀態。

然而,它並沒有重置mChildFragmentManager.這導致在Fragment重新attach時,它(fragment)沒有重新attachm childFragmentManager,從而引發了上面的異常.

解決方案:

在每個調用getChildFragmentManager()的fragment中復寫onDetach()方法:

@OverridepublicvoidonDetach() {super.onDetach();try{Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");childFragmentManager.setAccessible(true);childFragmentManager.set(this,null);}catch(NoSuchFieldException e) {thrownewRuntimeException(e);}catch(IllegalAccessException e) {thrownewRuntimeException(e);}}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

四、java.lang.IllegalArgumentException: Illegal character in query at index

這個異常,在我們拼接請求參數時,可能會碰到,原因是裡面的特殊字元轉換異常。解決辦法如下:

url轉換問題

String url = baseUrl + 「?」 + 「name=」 + name + 「&age=」 + age;

url = url.replaceAll(「&」, 「%26」);

url = url.replaceAll(」 「, 「%20」);

解釋如下:

特殊符號替換符號

?%3F

&%26

|%124

=%3D

#%23

/%2F

+%2B

%%25

空格%20

五、eclipse連接小米2S調試程序的問題

雖然快2年沒用過eclipse了,但這個問題還是貼出來,也許正好有正在用eclipse的同學遇到了此問題:

小米Mi2S連接到eclipse上無法識別。即使開啟了調試模式,也無法識別.終於找到了一個可用的方法。

方法

用數據線連接手機和電腦。

打開手機撥號界面。

在撥號界面按 # #717717# # 自動就開啟了。

在通知欄會出現一個 Diag USB port enable。

當然,應該是需要ROOT許可權的。

這時候你的PC機會彈出安裝設備驅動。

如果不成功,多插拔幾次試試。

ok!安裝完就搞定了!這時候打開eclipse就會在Driver裡面看到你的手機了。

注意事項

在PC機上安裝新硬體向導時候可能會遭遇到缺少dll文件,比如我就遇到缺少了WinUSBCoInstaller2.dll,這個問題。這時候就要去網上找找嘍。這個東西分x64 和 x86的,注意不要搞錯了!

如果先打開eclipse,再安裝的話,可能導致eclipse掛掉,不明原因,可能是我機器配置不行。兩次均有這種狀況。所以建議先安裝後再開eclipse。

熱點內容
linux部署windows 發布:2025-07-13 22:53:37 瀏覽:261
c語言printf函數用法 發布:2025-07-13 22:53:30 瀏覽:293
壓縮蘿卜干 發布:2025-07-13 22:52:01 瀏覽:672
為什麼dns一直配置錯誤 發布:2025-07-13 22:43:06 瀏覽:258
fortran如何編譯 發布:2025-07-13 22:31:05 瀏覽:480
sql語句查詢欄位 發布:2025-07-13 22:24:20 瀏覽:632
python目錄遍歷 發布:2025-07-13 22:16:24 瀏覽:96
賣房說解壓 發布:2025-07-13 22:06:49 瀏覽:216
C加密傳輸 發布:2025-07-13 22:06:08 瀏覽:162
配置不合理怎麼解決 發布:2025-07-13 22:01:07 瀏覽:735