异常
程序中不正常的情况分为两大类:错误(Error)和异常(Exception)
错误(Error):程序本身无法对这种不正常的情况进行处理,将会导致程序崩溃;
例如:内存耗尽错误,JVM崩溃错误等
异常(Exception):程序可以特殊的代码,对不正常的情况进行捕获和处理,程序可以继续运行;
例如:除零异常,空指针异常,数组下标越界异常
捕获异常
语法格式1: try{ //可能出现异常的代码 }catch(异常类 变量名){ //出现异常后的处理代码 //printStackTrace();方法会输出栈内存中的异常信息 变量名. printStackTrace(); } 语法格式2: try{ //可能出现异常的代码 }finally{ //finally块:一般释放资源的语句,比如关闭流,关闭数据库的连接 } finally:不管try中的代码是否出现异常,都会执行finally块中的代码 语法格式3: try{ }catch(异常类 变量名){ }finally{ //即使try块或catch块中出现return语句,finally块中依然会执行 //如果在try块或catch块中出现System.exit(int);语句,finally块将无法执行 } 多重catch块:多重catch块中的异常类,一定是从小到大排列,兄弟异常类不分顺序 try{ }catch(子异常类 变量名){ }catch(子异常类 变量名){ }catch(父异常类 变量名){ }...[finally{}] try、catch和finally都不能单独存在,但是try和catch 、 try和finally 可以在一起使用,catch和finally不能单独在一起使用
声明异常
语法格式:[访问修饰符] 返回值类型 方法名() throws 异常类{}
抛出异常
语法格式:throw 异常对象;
实例: package exception; /** * 演示异常的声明和抛出 * * @author 学霸联盟 - 赵灿 */ public class ExceptionDemo { //声明方法m1,并声明该方法会出现一个RuntimeException类型的异常 public void m1() throws RuntimeException { /* * 抛出一个RuntimeException类型的异常,没有使用try-catch捕获 * 使用声明异常的方式,将此处抛出的异常交给调用者m2处理 * 声明异常的类型,必须是抛出异常类型或其父类型 */ throw new RuntimeException(); } //声明方法m2,并声明该方法会出现一个Exception类型的异常 public void m2() throws Exception { try { // 调用声明了RuntimeException异常的方法m1 // 并使用try-catch处理m1中抛出的异常 m1(); /* 因为catch块是按照异常类型匹配捕获的,而方法m1声明的是RuntimeException;所以catch的小括号中只能声明RuntimeException或RuntimeException父类型的变量不能声明RuntimeException的子类变量,因为这样不能保证异常被捕获 */ } catch (Exception ex) { // 此处抛出了一个Exception类型的异常 // 没有使用try-catch进行捕获处理,所以该方法也必须声明异常 throw new Exception(); } finally { /* * 不管try和catch块中的代码是否抛出异常,finally块中的代码都会执行 * 即使try或catch块中执行了return语句,finally块中的代码也会执行 * 除非try或catch块中执行了System.exit(int); * 或出现错误导致JVM崩溃,finally将不再执行 */ } } // 方法m3 public void m3() { try { /* * 调用声明了Exception异常的方法m2,而m3没有声明异常, * 所以必须使用try-catch块处理方法m2产生的异常 */ m2(); } catch (Exception ex) { /* * 抛出Exception类型的异常,而且没有使用try-catch进行捕获,也没有声明异常; * 但是在finally块中使用的return语句,所以代码可以正常编译和执行 */ throw new Exception(); } finally { /* * finally块中使用了return语句; * 会将catch块中抛出的Exception类型的异常覆盖; * 所以该方法可以既不声明异常,也不使用try-catch处理catch块中抛出的异常; * 一般不建议这样使用 */ return; } } public static void main(String[] args) { ExceptionDemo t = new ExceptionDemo(); t.m1(); } }
自定义异常
继承Exception或Exception的子类
实例: /** * 演示自定义异常类 * @author 学霸联盟 - 赵灿 */ public class MyExceptionDemo extends Exception{ public static void main(String[] args) { try { throw new MyException(); } catch (MyException e) { //调用printStackTrace方法 e.printStackTrace(); } } } /** * 创建自定义异常类MyException,继承Exception类或Exception的子类 * @author 学霸联盟 - 赵灿 */ class MyException extends Exception{ /** * 重写父类中的printStackTrace */ @Override public void printStackTrace() { System.out.println("恭喜你,中了我的自定义异常!"); } }
时间: 2024-11-16 13:42:48