一、要理解java异常处理是如何工作得,需要掌握以下三种情况
检查性异常:最具代表性得检查性异常是用户错误或者问题引起得异常,这是程序员无法预见得。例如要打开一个不存在得文件时,一个异常就发生了,这些异常在编译时不能被简单得忽略。
运行时异常:运行时异常是可能被程序员避免得异常。于检查性异常相反,运行时异常可以在编译时被忽略
错误(ERROR):错误不是异常,而是脱离程序员控制得问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,他们在编译也检查不到。
二、java把异常当作对象处理,并定义一个基类java.lang.Throwable,其结构如下:
一、抛出异常
当异常发生时,java虚拟机会自动抛出异常并给与提示,也可以通过throw、throws主动抛出异常
package com.exception; import java.io.IOException; public class Test1 { public static void main(String[] args) { try { testThrows(1,0); }catch (ArithmeticException e){ System.out.println("Throws抛出异常"); } try { testThrow(1,0); }catch (ArithmeticException e){ System.out.println("Throw关键字抛出运行时异常,不需要在方法体上声明"); } String filePath = null; try{ testThrow(filePath); }catch (IOException e){ System.out.println("Throw关键字抛出非运行时异常,需要在方法体加throws异常抛出声明"); } } //测试Throws关键字 public static void testThrows(int a,int b) throws ArithmeticException{ System.out.println(a/b); } //测试Throw关键字抛出运行时异常 public static void testThrow(int a,int b) { if (b == 0){ throw new ArithmeticException();//运行时异常不需要在方法体上声明 } } //测试Throw关键字抛出非运行时异常,需要在方法体加throws异常抛出声明 public static void testThrow(String filePath) throws IOException { if (filePath == null){ throw new IOException();//运行时异常不需要在方法体上声明 } } }
二、捕获异常
可以通过try、catch、finally关键字对异常进行捕获、处理。
package com.exception; public class Test { public static void main(String[] args) { int a = 1; int b = 0; //捕获多个异常:异常的类型必须是从小到大捕获 try {//try监控区域 System.out.println(a/b); }catch (Error e){//catch后跟想要捕获地异常类型 System.out.println("程序出现错误"); }catch (Exception e){ System.out.println("程序出现异常,除数不能为零"); }catch (Throwable t){ System.out.println("程序出现异常或者错误"); } finally {//不管有不有异常发生都会被执行 System.out.println("finally"); } }