android異常-九游会j9娱乐平台
㈠ android這個異常是什麼問題導致的
上傳個項目文件看看,你oncreate咋寫的?
㈡ 捕獲到異常怎麼處理android就不會掛掉
uncaughtexceptionhandler介面
這個介面,顧名思義,就是處理程序中沒有處理的異常,而且是在系統拋出異常導致程序異常終止之前哦!
1. 首先,咱們得創建一個uncaughtexceptionhandler的具體類,比如:
復制內容到剪貼板
代碼:
public class crashhandler implements uncaughtexceptionhandler {
private static crashhandler instance; //單例引用,這里我們做成單例的,因為我們一個應用程序裡面只需要一個uncaughtexceptionhandler實例
private crashhandler(){}
public synchronized static crashhandler getinstance(){ //同步方法,以免單例多線程環境下出現異常
if (instance == null){
instance = new crashhandler();
}
return instance;
}
public void init(context ctx){ //初始化,把當前對象設置成uncaughtexceptionhandler處理器
thread.(this);
}
@override
public void uncaughtexception(thread thread, throwable ex) { //當有未處理的異常發生時,就會來到這里。。
log.d("sandy", "uncaughtexception, thread: " thread
" name: " thread.getname() " id: " thread.getid() "exception: "
ex);
string threadname = thread.getname();
if ("sub1".equals(threadname)){
log.d("sandy", ""xxx);
}else if(){
//這里我們可以根據thread name來進行區別對待,同時,我們還可以把異常信息寫入文件,以供後來分析。
}
}
}
2. 其次,我們自定義application類
復制內容到剪貼板
代碼:
public class ourapplication extends application {
@override
public void oncreate() {
super.oncreate();
crashhandler handler = crashhandler.getinstance();
handler.init(getapplicationcontext()); //在appliction裡面設置我們的異常處理器為uncaughtexceptionhandler處理器
}
}
3. 配置androidmanifest.xml文件
由於我們使用自定義的application,所以我們要在androidmanifest.xml文件中申明它
復制內容到剪貼板
代碼:
android:label="@string/app_name"
android:name=".ourapplication"
android:debuggable="true"
>
4. 測試
我們在activity裡面啟動一個線程,然後線程裡面拋出一個異常,看看程序會怎麼樣
復制內容到剪貼板
代碼:
button btn = (button) findviewbyid(r.id.bt);
btn.setonclicklistener(new view.onclicklistener() {
@override
public void onclick(view v) {
thread thread = new thread(new runnable() {
@override
public void run() {
log.d("sandy", "i am a sub thread");
string s = null;
s.tostring(); //拋出nullpointexception
}
}, "sub thread");
thread.start();
}
5. 結果
由於我們有默認未處理異常的處理程序,所以會列印下面的日誌信息,而不會拋出異常導致程序異常終止
d/sandy ( 2228): i am a sub thread
d/sandy ( 2228): uncaughtexception, thread: thread[sub thread,5,main] name: sub thread id: 148exception: java.lang.nullpointerexception
大家還等什麼呢?趕緊在自己的應用裡面添加上默認未處理異常處理器吧!再也不會因為異常未捕獲發生程序崩潰了。。^_^
㈢ 安卓常見異常
在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()方法可以分別得到異常對象的額外信息、類名和調用堆棧的信息。並且後一種包含的信息是前一種的超集。
㈣ android開發怎麼拋出個異常
直接throw拋出異常或者做會引起異常的操作就行了
拋出一個空指針異常
thrownewnullpointerexception();
做除零操作(會拋出異常)
inti=1/0;
㈤ android 開發中常見的異常有哪些,如何處理
1.r.java消失或解析異常
查看res中資源文件,圖片,xml等。比如圖片文件名不能有大寫不能有空格。
搞定錯誤之後project->clean就可以了。
2.自定義title欄。
首先要z在values->styles中定義一個style,然後在mainfest文件中設置android:theme.
最後在activity中按照這個順序寫:
super.oncreate(savedinstancestate);
requestwindowfeature(window.feature_custom_title);
setcontentview(r.layout.activity_main);
getwindow().setfeatureint(window.feature_custom_title, r.layout.title_layout);
3.sqlite isfirst和isbeforefirst方法的區別:
看下面一段代碼
cursor c = querythecursor(type);
if(c.movetolast())
while (!c.isbeforefirst()) {
string tmpcontent = new string();
tmpcontent = c.getstring(c.getcolumnindex("content"));
contents.add(tmpcontent);
c.movetoprevious();
}
c.close();
代碼的作用是逆序輸出表中的內容,第三行如果用的是isfirst()的話就無法輸出第一行,正確做發是用isbeforefirst()。
4.eclipse刪除空行
在eclipse中刪除某一行就用ctrl d快捷鍵。如果你想刪除一個文件中的所有空行呢。
可以用下面方法。
1)打開源碼編輯器
2)使用快捷鍵ctrl f
3)在find輸入框中輸入:^\s*\n
4)replace with輸入框的值為空
5)在【options】選中的"regular expressions"
6)點擊【replace all】按鈕。
㈥ android 開發遇到的異常 badtokenexception
導致報這個錯是在於new alertdialog.builder(mcontext),雖然這里的參數是alertdialog.builder(context context)但我們不能使用getapplicationcontext()獲得的context,而必須使用activity,因為只有一個activity才能添加一個窗體。
解決方法:將new alertdialog.builder(context context)中的參數用activity.this(activity是你的activity的名稱)來填充就可以正確的創建一個dialog了。
㈦ android異常java.ioexception:no such file or directory
/data/data/a.iotest.test.run/
這個目錄是否存在?
是否有許可權在該目錄創建文件?
㈧ android異常java.lang.exceptionininitializererror
mcontext本來就等於null, 因為你沒有初始化instance, 在你的靜態函數里改一改吧。
if (instance == null) return new myapplication();
else return instance;
㈨ android程序異常,有誰能幫我,分析一下原因。
頂三樓,應該是你的activity在你的清單文件中沒有注冊 ,你自己先檢查一下吧 ,爆出的異常雖然是中文,但是表述的很清楚,簡單找軟體翻譯一下自己就知道了
㈩ android中anr異常是什麼意思
anr (「application not responding」),意思是」應用沒有響應「。
在如下情況下,android會報出anr錯誤:
1.主線程 (「事件處理線程」 / 「ui線程」) 在5秒內沒有響應輸入事件。
2.broadcastreceiver 沒有在10秒內完成返回。
通常情況下,下面這些做法會導致anr:
1、在主線程內進行網路操作。
2、在主線程內進行一些緩慢的磁碟操作(例如執行沒有優化過的sql查詢)。
應用應該在5秒或者10秒內響應,邏輯應該是:
1. new出一個新的線程,進行數據請求。
2. 獲取數據後,調用handler.sendmessage方法。
3. 在handler的handle()方法中更新ui。