JAVA 中異常的分類


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的形式告訴調用者必須處理這個異常。否則編譯會報錯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM