java异常分类三大类_JAVA 中异常的分类

本文详细介绍了Java中Error、RuntimeException和Exception三类异常的区别。Error通常指程序无法处理的严重问题,如内存溢出;RuntimeException是由于编程错误导致的,如空指针异常;Exception是常规异常,程序可以捕获并处理,如文件未找到异常。作者通过实例解释了RuntimeException的使用,强调其作为非检查异常,不需要强制捕获,适合提示调用者修正调用顺序。

JAVA中的异常可以大体上分为三大类:

Error,RuntimeException,Exception 基类Throwable派生的。

使用的方法也是基本一致的,都是通过关键字throw+Throwable的形式报告这个异常或错误。

但是这三类Throwable对象所代表的错误的含义和使用的场景是不同的:

1.Error,这个一般是指程序无法处理的异常,如内存溢出,进程被强行结束等。

2.RuntimeException是指由于代码编写方式不当而造成的异常,比如如下语句:

public voidfunc1()

{

String str1= null;

str1.subString(1);

}

还有一种情况就是,你设计了一个类,而且这个类有几个public方法。你希望这个类的使用者按一定的顺序来调用这个方法,

而如果调用者没有按照你预期的方式来调用,你就可以抛出一个RuntimeException告诉他需要先做一些什么样的处理。

比如下面这个SQLite读写的类:

packagecom.aj.client.jwtpt.storage;importandroid.content.Context;importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;/*** Created by pwz on 2016/9/18.*/

public class MyBaseHelper extendsSQLiteOpenHelper {

MyBaseHelper(Context context) {super(context, "users.db", null, VERSION);

}public static final int VERSION = 1;

@Overridepublic voidonCreate(SQLiteDatabase db) {

db.execSQL("create table " + "table1" + "(" +

"id" + " text primary key not null," +

"title" +")");

}

@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, intnewVersion) {

}

}

packagecom.aj.client.jwtpt.storage;importandroid.content.ContentValues;importandroid.content.Context;importandroid.database.sqlite.SQLiteDatabase;/*** Created by pwz on 2016/9/18.*/

public classDBStorage {private SQLiteDatabase mDateBase = null;private static DBStorage _instance = null;public staticDBStorage getInstance() {if (_instance == null) {

_instance= newDBStorage();

}return_instance;

}privateDBStorage() {

}public voidinit(Context context)

{

mDateBase= newMyBaseHelper(context).getWritableDatabase();

}public voidinsertTitle(String sTitle)

{if(mDateBase==null)

{throw new RuntimeException("请先调用init方法");

}else{

ContentValues values= newContentValues();

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的形式告诉调用者必须处理这个异常。否则编译会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值