1.使用try-catch-finally处理异常
try{
//执行可能会发生异常的代码
}catch(异常类型 e){
//捕获异常进行处理
}finally{
//一定会执行的语句
}
try-catch-finally 程序块的流程大致分为两种情况:
-
如果try块中所有语句正常执行完毕,那么finally块就会被执行。
-
如果try语句在执行过程中碰到异常,无论这种异常能否被catch块捕获到,都将执行finally块中的代码。
try-catch-finally结构中try块是必须有的,catch和finally块为可选,但两者至少必须出现其中之一。
-
try—catch-catch-finally(多重catch块)
try{ }catch (异常类型 e) { }catch (异常类型 e) { }finally{ }
如果try...catch...finally...语句块中包含 return 那么先执行完finally在执行return,return语句会等finally执行完之后在执行
-
除非System.exit(1);强制关闭虚拟机,不会执行return
- 如果System.exit(1)在finally之前,finally也不会执行
catch输出异常信息方法
-
getMessage() 返回异常描述字符串
-
printStackTrace() 输出异常的堆栈信息 报错行
-
System.err.println();这种输出方式可以输出错误的消息,在控制台呈现红色。
2.使用throw、throws抛出异常
-
若是某个方法可能发生异常,但不想在当前方法中处理这个异常,则可以使用throws、throw关键字在方法中抛出异常。
-
throws通常用在声明方法时,用来制指定可能抛出的异常。多个异常可以使用逗号分隔。
public void method() throws ArrayIndexOutOfBoundsException,NullPointerException,NumberFormatException,Exception{ }
-
throw关键字通常用于方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即终止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法的声明中指明要抛出的异常;如果要捕获throw抛出的异常,则必须使用try-catch语句块
private void test() { try { method(); } catch (RuntimeException e) { e.printStackTrace(); } } private void method() throws RuntimeException{ throw new RuntimeException("message"); }
-
如果调用的下级方法往上抛异常,如果不想捕捉异常可以用throws继续往上抛异常
3.自定义异常
创建自定义异常需要继承Exception
public class CustomException extends Exception {
public CustomException(String message) {
super(message);
}
}
4.常见异常
-
java.lang.ArrayIndexOutOfBoundsException 数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。
-
java.lang.ArithmeticException 算术条件异常。譬如:整数除零等。
-
java.lang.SecurityException 安全性异常
-
java.lang.IllegalArgumentException 非法参数异常
-
java.lang.ArrayStoreException 数组中包含不兼容的值抛出的异常
-
java.lang.NegativeArraySizeException 数组长度为负异常
-
java.lang.NullPointerException 空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等。
-
IOException 操作输入流和输出流时可能出现的异常
-
EOFException 文件已结束异常
-
FileNotFoundException 文件未找到异常
-
java.io.NotSerializableException 对象不支持序列化 参与序列化和反序列化对象必须实现Serializable接口
-
java.io.StreamCorruptedException 当从对象流中读取的控制信息与内部一致性检查相冲突时,抛出此异常。
-
ClassCastException 类型转换异常类
-
ArrayStoreException 数组中包含不兼容的值抛出的异常
-
SQLException 操作数据库异常类
-
NoSuchFieldException 字段未找到异常
-
NoSuchMethodException 方法未找到抛出的异常
-
NumberFormatException 字符串转换为数字抛出的异常
-
StringIndexOutOfBoundsException 字符串索引超出范围抛出的异常
-
IllegalAccessException 不允许访问某类异常
-
InputMismatchException 输入格式不匹配异常
-
InstantiationException 当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常
-
java.lang.ClassNotFoundException 找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
-
ConcurrentModificationException 是基于java集合中的 快速失败(fail-fast) 机制产生的,在使用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了增删改,就会抛出该异常。快速失败机制使得java的集合类不能在多线程下并发修改,也不能在迭代过程中被修改。
-
java.lang.InterruptedException 线程被打断异常
-
IllegalThreadStateException 如果该线程处于活动状态。
-
SecurityException 如果当前线程无法修改该线程。
-
java.lang.ClassCastException 强制转换异常
-
IllegalFormatConversionException 使用不匹配转换和相应参数类构造此类的实例。
-
java.util.NoSuchElementException 没有这样的元素异常
-
RedisConnectionFailureException redis缓存连接失败异常