android異常類型
1. 為什麼Android應用異常
是應用自身或者系統導致的異常,如內存不足,內存泄露,應用自身處理流程產生了異常,對特殊場景沒有考慮和測試全面,對文件的讀寫,網路的存取,資料庫的查詢等沒有處理好或者沒有及時響應用戶的操作等都會產生異常。
望採納。
2. 安卓常見異常
在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()方法可以分別得到異常對象的額外信息、類名和調用堆棧的信息。並且後一種包含的信息是前一種的超集。
3. 在android中,數據下標越界,則發生什麼異常
在android中,數據下標越界,會發生IndexOutOfBoundsException——下標越界異常。
Android應用使用Java語言進行開發,常見的異常還有:
1、NullPointerException - 空指針引用異常;
2、ClassCastException - 類型強制轉換異常;
3、IllegalArgumentException - 傳遞非法參數異常;
4、ArithmeticException - 算術運算異常;
5、ArrayStoreException - 向數組中存放與聲明類型不兼容對象異常;
6、NegativeArraySizeException - 創建一個大小為負數的數組錯誤異常;
7、NumberFormatException - 數字格式異常;
8、SecurityException - 安全異常;
9、UnsupportedOperationException - 不支持的操作異常。
4. android 404 對應哪個異常
android 404是指請求的url地址不存在。是http協議的一部分,詳解請看android學習手冊,
上面內容來源於andrid學習手冊,裡面有108個例子,文檔還有源碼,360手機助手中下載

404
(HTTP狀態碼)
編輯
HTTP 404或Not Found錯誤信息是HTTP的其中一種「標准回應信息」(HTTP狀態碼),此信息代表客戶端在瀏覽網頁時,伺服器無法正常提供信息,或是伺服器無法回應且不知原因。
中文名
網頁或文件未找到
外文名
NOT FOUND
HTTP狀態碼
404
目錄
1影響
2實現
3設置
影響
編輯
自定義404錯誤頁面是增強用戶體驗的很好的做法,但在應用過程中往往並未注意到對搜索引擎的影響,譬如:錯誤的伺服器端配置導致返回「404」狀態碼或自定義404錯誤頁面使用Meta Refresh導致返回「302」狀態碼。正確設置的自定義404錯誤頁面,不僅應當能夠正確地顯示,同時,應該返回「404」錯誤代碼,而不是 「200」或「302」。雖然對訪問的用戶而言,HTTP狀態碼究竟是「404」還是「200」來說並沒有什麼區別,但對搜索引擎這則是相當重要的。
搜索引擎蜘蛛在請求某個URL時得到「404」狀態回應時,即知道該URL已經失效,便不再索引該網頁,並向數據中心反饋將該URL表示的網頁從索引資料庫中刪除,當然,刪除過程有可能需要很長時間;而當搜索引擎得到「200」狀態碼時,則會認為該url是有效的,便會去索引,並會將其收錄到索引資料庫,這樣的結果便是這兩個不同的url具有完全相同的內容:自定義404錯誤頁面的內容,這會導致出現復制網頁問題。輕則被搜索引擎降權,重則會K掉網站。
實現
編輯
改變伺服器默認錯誤頁面就可以達到效果。下面是一些可以使得訪客輕松實現正常訪問的建議。
遵循的理念:
有趣的404(18張)
提供簡明的問題描述,消除訪客的挫敗感。提供合理的解決方案,輔助訪客完成訪問目標。提供個性化的友好界面,提升訪問體驗。
實現方式(按照從簡單到復雜的順序排列):
使得訪客轉到某個地方而不是後退。
頁麵包含該站點重要部分的鏈接,如主頁或站點地圖。不要僅僅告訴他們檢查拼寫。使用文本的鏈接替代圖片,因為有許多訪客不會想到點擊這個圖片。
例子:我們的站點有一個主頁的返回鏈接。這是實現友好反饋的最低限度。此外,我們還會考慮,在有效的幫助信息不足的情況下,如何通過訪客的反饋彌補錯誤。
需要包括一個指向網站管理員的email鏈接,或者一個用於提交丟失鏈接的表格。
相對於發送email,訪客更喜歡使用提交表格。
加入一個搜索框用於搜索站點。
例:MSN在所有頁面的底部都有一個搜索框,同時也鏈向站點的重要部分。
在站點中列出接近於訪客期望頁面的鏈接,用於推測訪客正在尋找的頁面。你不需要採納上述所有的建議,但是這些建議一致服務於使得訪客更願意停留在你的站點的目的。
合理的404錯誤頁面至此即可以完成了,這將給訪客提供許多有價值的信息。[1]
設置
編輯
1. 對於存在的網頁內容由於路徑改變而導致訪問不了時,可在IIS 中定義404錯誤指向一個動態頁面,在頁面裡面使用301永久重定向跳轉到新的地址,此時伺服器返回301狀態碼。
2、設置404指向一個設計好的html 文件,此時頁面返回的404狀態碼。 idc提供商基本都提供404設置的功能,直接上傳文件設置即可。在IIs中設置方法:打開IIS管理器-->點擊要設置自定義404的網站的屬性-->點擊自定義錯誤選項-->選中404頁-->選中並打開編輯屬性-->設置成 URL --> URL 里填寫「/err404.html」-->按確定退出再把做好的err404.html 頁面上傳到網站根目錄下。此處在「消息類型」中一定要選擇「文件」或「默認值」,而不要選擇「URL」,不然,將導致返回「200」狀態碼。3、404指向一個動態頁面,比如error.asp,如果不在頁面裡面進行設置,僅僅是返回提示的HTML 代碼,將導致頁面返回200 狀態碼,這是不正確的,我們可以在顯示完提示內容後,增加語句: Response.Status="404 Not Found" ,這樣就保證頁面返回404狀態碼。
3、Apache下設置404錯誤頁面。為Apache Server設置404錯誤頁面的方法很簡單,只需在.htaccess 文件中加入如下內容即可,ErrorDocument 404 /notfound.php
5. Android致命異常:可以問題,怎麼解決
一般在報錯信息的後面幾行,特別和你應用程序有關的類,可以雙擊點入進行查看
1. Caused by: java.lang.SecurityException:Permission denied (missing INTERNET permission?)
解釋:安全異常---缺少了INTERNET的許可權
2.org.json.JSONException: No value for datas
解釋:被JSONException捕獲的異常:datas這個標簽取沒有值
3. Caused by: NullPointerException:***
解釋:空指針異常
1)可能1:使用對對象沒有開辟空間,使用的對象沒有new
2)可能2:被引用的對象沒有開辟空間,被使用的對象沒有new
4. Caused by: OOM(
out of memory)
解釋:如果當一次性載入圖片的大小超過4MB的時候,會報這樣的錯誤
5.java.lang.ClassCastException:java.lang.String cannot be cast tocom.qianfeng.gridviewfromnet.MainActivity$MyAdapter$ViewHolder
解釋:類型轉換錯誤,String不能被轉換成MyAdapter里的ViewHolder
6.Caused
by:android.content.ActivityNotFoundException: Unable to find explicit
activityclass{com.qianfeng.day41_gridviewicon/com.qianfeng.day41_gridviewicon.GridViewActivity};have
you declared this activity in your AndroidManifest.xml?
解釋:沒有去清單文件申明指定的activity
7.java.lang.IllegalStateException:Could
not find a method btnClick(View) in the activity
classcom.qianfeng.day41_dialoglist.MainActivity
for onClick handler on view classandroid.widget.Button with id
'btn_normallist'
解釋:是這id:btn_normallist的button沒有在代碼里找到btnClick(View)
8.android.content.res.Resources$NotFoundException:String resource ID #0x0
解釋:資源的地址沒有被找到
可能:設置的參數應該是0x....的地址,但實際卻被賦值了
9. java.lang.IndexOutOfBoundsException:Invalid index 3, size is 2
解釋:數組下標越界
10.android.view.WindowManager$BadTokenException:Unable to add window -- token null is not valid; is your activity running?
解釋:你的Activity沒有完全的運行起來,卻在window窗口去顯示popUpMenu
6. Android 全局異常是什麼意思
Android系統的「程序異常退出」,給應用的用戶體驗造成不良影響。為了捕獲應用運行時異常並給出友好提示,便可繼承UncaughtExceptionHandler類來處理。通過Thread.()方法將異常處理類設置到線程上即可。
1、異常處理類,代碼如下:
[java] view plain
public class CrashHandler implements UncaughtExceptionHandler {
public static final String TAG = "CrashHandler";
private static CrashHandler INSTANCE = new CrashHandler();
private Context mContext;
private Thread.UncaughtExceptionHandler mDefaultHandler;
private CrashHandler() {
}
public static CrashHandler getInstance() {
return INSTANCE;
}
public void init(Context ctx) {
mContext = ctx;
mDefaultHandler = Thread.();
Thread.(this);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
// if (!handleException(ex) && mDefaultHandler != null) {
// mDefaultHandler.uncaughtException(thread, ex);
// } else {
// android.os.Process.killProcess(android.os.Process.myPid());
// System.exit(10);
// }
System.out.println("uncaughtException");
new Thread() {
@Override
public void run() {
Looper.prepare();
new AlertDialog.Builder(mContext).setTitle("提示").setCancelable(false)
.setMessage("程序崩潰了...").setNeutralButton("我知道了", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.exit(0);
}
})
.create().show();
Looper.loop();
}
}.start();
}
/**
* 自定義錯誤處理,收集錯誤信息 發送錯誤報告等操作均在此完成. 開發者可以根據自己的情況來自定義異常處理邏輯
*
* @param ex
* @return true:如果處理了該異常信息;否則返回false
*/
private boolean handleException(Throwable ex) {
if (ex == null) {
return true;
}
// new Handler(Looper.getMainLooper()).post(new Runnable() {
// @Override
// public void run() {
// new AlertDialog.Builder(mContext).setTitle("提示")
// .setMessage("程序崩潰了...").setNeutralButton("我知道了", null)
// .create().show();
// }
// });
return true;
}
}
2、線程綁定異常處理類
[java] view plain
public class CrashHandlerActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(this); //傳入參數必須為Activity,否則AlertDialog將不顯示。
// 創建錯誤
throw new NullPointerException();
}
}
7. 如何查看android產生的異常
android程序如果出問題,因為實際是java程序,所以會拋出異常,比如這樣。彈出的警告對話框中沒有異常信息,如果需要看到日誌內容,可執行:adb logcat即可見到異常信息。或者通過ddms,通過device》run logcat通過圖形界面查看日誌,和上面的命令效果一樣。這是一個異常的內容:W/dalvikvm(26121): threadid=3: thread exiting with uncaught exception (group=0x4000fe70) E/AndroidRuntime(26121): Uncaught handler: thread main exiting e to uncaught exception E/AndroidRuntime(26121): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.easymorse.activity/com.easymorse.activity.ActivityTest}: java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10032 nor current process has android.permission.READ_PHONE_STATE. E/AndroidRuntime(26121): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2268) E/AndroidRuntime(26121): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284) E/AndroidRuntime(26121): at android.app.ActivityThread.access$1800(ActivityThread.java:112) E/AndroidRuntime(26121): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692) E/AndroidRuntime(26121): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(26121): at android.os.Looper.loop(Looper.java:123) E/AndroidRuntime(26121): at android.app.ActivityThread.main(ActivityThread.java:3948) E/AndroidRuntime(26121): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(26121): at java.lang.reflect.Method.invoke(Method.java:521) E/AndroidRuntime(26121): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782) E/AndroidRuntime(26121): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540) E/AndroidRuntime(26121): at dalvik.system.NativeStart.main(Native Method) E/AndroidRuntime(26121): Caused by: java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10032 nor current process has android.permission.READ_PHONE_STATE. E/AndroidRuntime(26121): at android.os.Parcel.readException(Parcel.java:1234) E/AndroidRuntime(26121): at android.os.Parcel.readException(Parcel.java:1222) E/AndroidRuntime(26121): at com.android.internal.telephony.IPhoneSubInfo$Stub$Proxy.getLine1Number(IPhoneSubInfo.java:223) E/AndroidRuntime(26121): at android.telephony.TelephonyManager.getLine1Number(TelephonyManager.java:498) E/AndroidRuntime(26121): at com.easymorse.activity.ActivityTest.onCreate(ActivityTest.java:18) E/AndroidRuntime(26121): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123) E/AndroidRuntime(26121): … 11 more日誌引用在android系統中獲取imei號和其他手機信息 發送文章為PDF
8. 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】按鈕。
9. android常見的編譯時異常有哪些
這個是有可能的,舉個例子int x = 10/0;這個就會拋出異常的,因為0是不能作為除數的,這也將導致程序崩潰退出。
因此,在程序中不確定的地方應該多進行if語句的判斷,適當加入trycatch語句進行異常的捕獲。
10. 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方法的區別:
