JAVA中的異常可以大體上分為三大類:
Error,RuntimeException,Exception 基類Throwable派生的。
使用的方法也是基本一致的,都是通過關鍵字throw+Throwable的形式報告這個異常或錯誤。
但是這三類Throwable對象所代表的錯誤的含義和使用的場景是不同的:
1.Error,這個一般是指程序無法處理的異常,如內存溢出,進程被強行結束等。
2.RuntimeException是指由於代碼編寫方式不當而造成的異常,比如如下語句:
public void func1() { String str1 = null; str1.subString(1); }
還有一種情況就是,你設計了一個類,而且這個類有幾個public方法。你希望這個類的使用者按一定的順序來調用這個方法,
而如果調用者沒有按照你預期的方式來調用,你就可以拋出一個RuntimeException告訴他需要先做一些什么樣的處理。
比如下面這個SQLite讀寫的類:
package com.aj.client.jwtpt.storage; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** * Created by pwz on 2016/9/18. */ public class MyBaseHelper extends SQLiteOpenHelper { MyBaseHelper(Context context) { super(context, "users.db", null, VERSION); } public static final int VERSION = 1; @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table " + "table1" + "(" + "id" + " text primary key not null," + "title" +")"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
package com.aj.client.jwtpt.storage; import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; /** * Created by pwz on 2016/9/18. */ public class DBStorage { private SQLiteDatabase mDateBase = null; private static DBStorage _instance = null; public static DBStorage getInstance() { if (_instance == null) { _instance = new DBStorage(); } return _instance; } private DBStorage() { } public void init(Context context) { mDateBase = new MyBaseHelper(context).getWritableDatabase(); } public void insertTitle(String sTitle) { if(mDateBase==null) { throw new RuntimeException("請先調用init方法"); } else { ContentValues values = new ContentValues(); values.put("title",sTitle); mDateBase.insert("table1",null,values); } } }
當使用者拿到DBStorage的實體之后,如果在沒有調用init()方法之前就調用了insertTitle(String sTitle)就收到一個RuntimeException.
有人可能會問,我把throw new RuntimeException("請先調用init方法");替換成throw new Exception("請先調用init方法");有何不妥呢?
這里之所以用RuntimeException還因為它是一個非檢查異常(Unchecked Exception),也就是說你不在拋出該異常對應的函數名后面聲明throws RuntimeException
編譯也能通過,而且通常情況下。你也不希望調用者去捕獲處理這個異常,你僅僅是希望他知道,他的調用方式有問題。
3.Exception
這類異常,就更像是一般意義上的異常。它一般是指程序在運行時碰到了一些意外,但是程序還可以處理的情況。比如網絡斷開了,用戶彈出了SD卡等等。這類異常屬於檢查異常
(checked exception),也就是說如果你在函數體內拋出了一個異常。函數名后面就必須用throws Exception的形式告訴調用者必須處理這個異常。否則編譯會報錯。