异常
是导致程序中断执行的一种指令流,如果程序出现异常,但是没有经过合理的异常处理,程序就会终止执行。为了保证程序继续向下执行,就需要异常处理。
异常的处理
处理的语法:
try { 有可能出现异常的语句; } catch (异常类 对象) { 异常的处理语句; } ... catch { // 多条catch语句 异常的处理语句; } finally { 异常的统一出口; }
try 里面存放可能触发异常的代码,catch 捕获并处理你在 try 里面触发的异常,finally 是无论如何都要执行的。即使是 try 引发了一个异常,但是你并没有在 catch 里面对这种异常进行处理,任然会执行 finally 里面的代码,然后 jvm 处理这个异常(就是打印错误信息到控制台)。
- 关于 finally
- (一)Java 中有垃圾回收机制,不需要在 finally 中释放内存。但是在要把出内存之外的资源恢复到他们初识状态时,就需要用到 finally。比如:已经打开的文件或网络连接,在屏幕上画的图形。
- (二)try 中的return 语句执行后任然会执行 finally(先 return 后 finally),return 返回值若在 finally 中进行修改是不会对返回值产生影响的,return 返回值会保存一个自己的副本在栈里面,最后返回的还是这个信息。
取得异常信息
e.printStackTrace(); // 打印出异常抛出地点的方法的调用序列
throws 关键字
在进行方法定义时,告诉调用者本方法可能产生哪些异常,就可以使用 throws 定义方法。也就是该方法出现问题后,不希望进行处理,就使用 throws 抛出。调用该方法时必须明确使用try…catch 处理或者继续 throws 往上抛出。
主方法也可以使用 throws 抛出异常,抛出的异常交给 jvm 处理。
public void function() throws Exception, ... {} // 可声明多个异常
throw 关键字
throw 是直接编写在语句之中的,表示人为进行异常抛出。用户不希望异常类对象由系统产生,希望用户控制异常类实例化对象的产生。
throw new Exception();
- 二者区别:
- throws 主要在方法声明上使用,告诉用户本方法可能产生的异常,同时该方法可能不处理此异常;
- throw 用于方法内部,主要表示进行手工异常抛出。
// 综合使用范例:
class Math {
public static int div(int x, int y) throws Exception { // 方法抛出异常,交给上一级调用去处理
int result = 0;
System.out.println("开始");
try {
result = x / y;
} catch (Exception e) {
throw e; // 抛出异常,自己不处理
} finally {
System.out.println("结束");
}
return result;
}
}
public class Test {
public static void main(String[] args) {
try {
System.out.println(Math.div(10, 0));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
RuntimeException 类
一些异常时简单的问题,使用不需要进行强制异常处理。如:NullPointerException、ClassCastException、NumberFormatException
断言
assert,JDK1.4开始引入概念。当程序执行到某些语句之后,其数据的内容一定是约定好的内容。使用 -ea 启动断言,若不是则输出推断语句背后的字符串。
int num = 10;
assert num == 300 : "错误,num的值不是300" // 推断,不是程序运行本身,用-ea 启动运行后判断执行
System.out.println(num);
异常类的继承体系
Java 把所有非正常情况分为两种:Error(错误)、Exception(异常)。错误是指与虚拟机相关的问题,应用程序无法处理这类问题,因此不需要我们关心;而异常信息就需要我们去捕获处理了,但是异常中的 RuntimeException 类并不强制用户去处理异常,会由系统自行处理。而其他异常都必须捕获处理。
自定义异常
继承父类:Exception 或者 RuntimeException;使用时就和使用 Java 自定义异常一样使用。
public class MyException extends Exception{
public MyException(String msg){
super(msg);
}
}