异常是指导致程序中断的一种指令流。
一旦产生异常之后,异常后面的语句不会执行,还是停留在异常位置,并且把异常报告给用户。
基本格式:
try{
//要执行的语句
}
catch(){
//抛出异常
}
finally{
//异常的唯一出口
}
例如:
public class ExceptionTest {
public static void main(String args[]){
int i = 10;
int j =0;
try {
int temp = i/j;
System.out.println(temp);
} catch (Exception e) {
// TODO: handle exception
System.out.println("exception:"+e);
}finally{
System.out.println("over");
}
}
}
异常类的继承结构:
Java的异常结构中 ,两个最常用的类是Exception和Error,这两个类都是Throwable 的子类。
Exception一般表示程序中出现的错误,可以用try...catch来解决;
而error指的是JVM错误,程序中无法处理。
Throwable
类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Javathrow
语句抛出。类似地,只有此类或其子类之一才可以是 catch
子句中的参数类型。
处理异常时可以直接用System.out.println()打印异常,也可以用Exception提供的一个方法:public void printStackTrace()
Java中处理异常的过程如下:
*一旦产生异常,则会产生一个异常类的实例化对象。
*在try语句中对该异常进行捕捉
*产生的异常对象与catch语句中各个异常类型进行匹配,如果匹配成功,则执行catch中的代码
*如果最后都没有匹配成功,则程序中断执行(一般少见)
catch中的异常类型可以直接写Exception,根据输出确定,但是最好分别捕获异常。
捕获更粗颗粒的异常语句要放在捕获更细颗粒异常的语句之后,就像漏水,沙子,石块一样,要先漏水,再是沙子,最后是石块。
throws关键字
在定义一个方法的时候可以使用throws关键字来说明,该方法不处理异常,但是调用该方法时,要处理异常。
例如:
class Math{
public int div(int i,int j) throws Exception{
int temp = i/j;
return temp;
}
}
public class ExceptionTest {
public static void main(String args[]){
int a = 10;
int b = 0;
Math math = new Math();
try { //必须使用try.catch捕捉异常
System.out.println(math.div(a, b));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
假如主方法上也使用了throws Exception,则主方法也不处理异常,此时处理异常的工具就是JVM。
throw关键字
throw的作用是在程序中抛出一个异常,它抛出的异常是一个异常类的实例化对象。
例如:
public class ExceptionTest {
public static void main(String args[]) throws Exception {
try {
throw new Exception("抛出一个异常");
} catch (Exception e) {
// TODO: handle exception
System.out.println(e);
}
}
}
一般实际开发中会把throw和throws结合使用。例如要显示所有的程序执行过程,同时也要打印出相关的异常,就要把所有的异常都交给方法调用处处理,
例如:
class Math {
public int div(int i, int j) throws Exception {
System.out.println("Start");
int temp = 0;
try {
temp = i / j;
} catch (Exception e) {
// TODO: handle exception
throw e;
} finally {
System.out.println("Over");
}
return temp;
}
}
public class ExceptionTest {
public static void main(String args[]) {
Math math = new Math();
try {
System.out.println(math.div(10, 0));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
使用异常时还可以自定义异常类,创建类继承Exception类即可。
Exception和RuntimeException的区别:
Exception在程序中必须使用try...catch处理;
RuntimeException则可以不使用try...catch处理,如果有异常产生,则交给JVM处理。