java.lang.Exception类是Java中所有异常的直接或间接父类。即Exception类是所有异常的根类。
比如程序:
public class ExceptionTest { public static void main(String[] args) { int a = 3; int b = 0; int c = a / b; System.out.println(c); } }
编译通过,执行时结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.learnjava.exception.ExceptionTest.main(ExceptionTest.java:9)
因为除数为0,所以引发了算数异常。
比较常见的异常还有这种:空指针异常
java.lang.NullPointerException是空指针异常,出现该异常的原因在于某个引用为null,但却调用了它的某个方法,这时就会出现该异常。
Java中的异常分为两大类:
1.Checked Exception(非Runtime Exception)
2.Unchecked Exception(Runtime Exception)
运行时异常
RuntimeException类是Exception类的子类,它叫做运行时异常,Java中的所有运行时异常都会直接或者间接地继承自RuntimeException类。
Java中凡是继承自Exception,而不继承自RuntimeException类的异常都是非运行时异常。
异常处理的一般结构
try { // 可能发生异常的代码 // 如果发生了异常,那么异常之后的代码都不会被执行 } catch (Exception e) { // 异常处理代码 } finally { // 不管有没有发生异常,finally语句块都会被执行 }
比如本文最开始的除法运算代码,加入异常处理之后:
public class ExceptionTest { public static void main(String[] args) { int c = 0; try { int a = 3; int b = 0; // 这块代码出现了异常 c = a / b; // 那么异常之后的代码都不会被执行 System.out.println("Hello World"); } catch (ArithmeticException e) { e.printStackTrace(); } finally { //不管有没有发生异常,finally语句块都会被执行 System.out.println("Welcome"); } System.out.println(c); // 当b为0时,有异常,输出为c的初始值0 } }
多个catch
一个try后面可以跟多个catch,但不管多少个,最多只会有一个catch块被执行。
异常处理方法
对于非运行时异常(checked exception),必须要对其进行处理,否则无法通过编译。
处理方式有两种:
1.使用try..catch..finally进行捕获;
2.在产生异常的方法声明后面写上throws 某一个Exception类型,如throws Exception,将异常抛出到外面一层去。
对非运行时异常的处理详见代码例子:
处理方式1:将异常捕获
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
public class ExceptionTest2 { public void method() throws Exception // 将异常抛出,由调用这个方法的方法去处理这个异常,如果main方法也将异常抛出,则交给Java虚拟机来处理 { System.out.println("Hello World"); // 抛出异常 throw new Exception(); } public static void main(String[] args) { ExceptionTest2 test = new ExceptionTest2(); try { test.method(); } catch (Exception e) { e.printStackTrace(); } finally { System.out.println("Welcome"); } } }
处理方式2:将异常继续向外抛出
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
public class ExceptionTest2 { public void method() throws Exception // 将异常抛出,由调用这个方法的方法去处理这个异常,如果main方法也将异常抛出,则交给Java虚拟机来处理 { System.out.println("Hello World"); // 抛出异常 throw new Exception(); } public static void main(String[] args) throws Exception // main方法选择将异常继续抛出 { ExceptionTest2 test = new ExceptionTest2(); test.method(); // main方法需要对异常进行处理 // 执行结果: // Hello World // Exception in thread "main" java.lang.Exception // at com.learnjava.exception.ExceptionTest2.method(ExceptionTest2.java:10) // at com.learnjava.exception.ExceptionTest2.main(ExceptionTest2.java:17) } }
对于运行时异常(runtime exception),可以对其进行处理,也可以不处理。推荐不对运行时异常进行处理。