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