一、什么是java异常
过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。
二、Throwable的子类
JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当
JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。
exception(异常):是程序本身可以处理的错误。
IlegalargumentExption非法参数异常
三、checkException可查异常和uncheckException不可查异常
四、处理异常机制
是指我们把异常的对象处理交给运行时系统。异常对象包含了异常类型,异常错误信息和状态等。
try-catch-finally 规则(异常处理语句的语法规则):
1)
必须在 try 之后添加 catch 或 finally 块。try 块后可同时接 catch 和 finally 块,但至少有一个块。
2)
必须遵循块顺序:若代码同时使用 catch 和 finally 块,则必须将 catch 块放在 try 块之后。
3)
catch 块与相应的异常类的类型相关。
4)
一个 try 块可能有多个 catch 块。若如此,则执行第一个匹配块。即Java虚拟机会把实际抛出的异常对象依次和各个catch代码块声明的异常类型匹配,如果异常对象为某个异常类型或其子类的实例,就执行这个catch代码块,不会再执行其他的 catch代码块
5)
可嵌套 try-catch-finally 结构。
6)
在 try-catch-finally 结构中,可重新抛出异常。
7)
除了下列情况,总将执行 finally 做为结束:JVM
过早终止(调用 System.exit(int));在 finally 块中抛出一个未处理的异常;计算机断电、失火、或遭遇病毒攻击。
五、常见异常
1、 java.lang.ArrayIndexOutOfBoundsException
数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。
2、java.lang.ArithmeticException
算术条件异常。譬如:整数除零等。
3、java.lang.NullPointerException
空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等
4、java.lang.ClassNotFoundException
找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
5、java.lang.NegativeArraySizeException 数组长度为负异常6、java.lang.ArrayStoreException 数组中包含不兼容的值抛出的异常
7、java.lang.SecurityException 安全性异常
8、java.lang.IllegalArgumentException 非法参数异常
2、Io异常
IOException:操作输入流和输出流时可能出现的异常。
EOFException
文件已结束异常FileNotFoundException
文件未找到异常3、其它
ClassCastException
类型转换异常类ArrayStoreException
数组中包含不兼容的值抛出的异常SQLException
操作数据库异常类NoSuchFieldException
字段未找到异常NoSuchMethodException
方法未找到抛出的异常NumberFormatException
字符串转换为数字抛出的异常StringIndexOutOfBoundsException
字符串索引超出范围抛出的异常IllegalAccessException
不允许访问某类异常InstantiationException
当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常
六、自定义异常
在程序中使用自定义异常类,大体可分为以下几个步骤。
(1)创建自定义异常类。
(2)在方法中通过throw关键字抛出异常对象。
(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
(4)在出现异常方法的调用者中捕获并处理异常。
七、throw和throws关键字的区别
throw用来抛出一个异常,在方法体内。语法格式为:throw 异常对象。
throws用来声明方法可能会抛出什么异常,在方法名后,语法格式为:throws 异常类型1,异常类型2...异常类型n。
八、自定义异常捕获
public class CrashHandler implements UncaughtExceptionHandler {
// CrashHandler实例
private static CrashHandler instance;
// 程序的Context对象
private Context mContext;
/** 保证只有一个CrashHandler实例 */
private CrashHandler() {
}
/** 获取CrashHandler实例 ,单例模式 */
public static CrashHandler getInstance() {
if (instance == null)
instance = new CrashHandler();
return instance;
}
/**
* 初始化
*/
public void init(Context context) {
mContext = context;
// 设置该CrashHandler为程序的默认处理器
Thread.setDefaultUncaughtExceptionHandler(this);
}
/**
* 当UncaughtException发生时会转入该函数来处理
*/
@Override
public void uncaughtException(Thread thread, Throwable ex) {
ex.printStackTrace();
handleException();
try {
Thread.sleep(3000);
} catch (Exception e) {
}
// 保存统计数据
MobclickAgent.onKillProcess(mContext);
// 退出程序
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}
/**
* 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
* @param ex
*/
private void handleException() {
// 使用Toast来显示异常信息
new Thread() {
@Override
public void run() {
Looper.prepare();
Toast.makeText(mContext, "很抱歉,出现异常", Toast.LENGTH_SHORT).show();
Looper.loop();
}
}.start();
}
}