Java 异常②
目录文章摘要1. throw 处理异常2. throws 声明异常3. throw 和 throws 的区别4. finally5. 自定义异常类文章摘要本文详细讲解了Java异常处理中的三个关键机制throw用于主动抛出异常对象需配合try-catch处理throws声明方法可能抛出的异常类型将异常传递给调用者处理finally块确保无论是否发生异常都能执行常用于资源释放。文章通过代码示例对比了throw和throws在作用、位置、语法等方面的区别并介绍了自定义异常类的创建方法及其优点。1. throw 处理异常throw 主动抛出一个异常对象。 语法 throw 异常对象;1.1 throw 示例publicclassTest{publicstaticvoidmain(String[]args){intage-1;if(age0){thrownewRuntimeException(年龄不能为负数);}System.out.println(正常执行);}}age 0new RuntimeException 对象throw 抛出程序异常结束后面的System.out.println(正常执行);不会执行1.2 throw 和 try-catch的结合如果抛出的异常有人捕获publicclassTest{publicstaticvoidtest(int[]a){try{if(anull){thrownewNullPointerException();}}catch(NullPointerExceptione){e.printStackTrace();}System.out.println(执行剩余代码);}publicstaticvoidmain(String[]args){int[]anull;test(a);}}2. throws 声明异常声明一个方法可能会抛出的异常把异常交给调用者处理语法 : 修饰符 返回值 方法名(参数) throws 异常类型 { }2.1 throws 示例publicclassTest{publicstaticvoidmain(String[]args)throwsIOException{readFile();}publicstaticvoidreadFile()throwsIOException{FileInputStreamfisnewFileInputStream(a.txt);}}编译阶段发现FileInputStream可能IOException↓检查有没有try-catch或throws↓有throws↓编译通过运行阶段执行new FileInputStream(a.txt)↓发现文件不存在↓真正产生IOException↓程序终止3. throw 和 throws 的区别throwthrows作用主动抛异常声明异常位置方法内部方法声明处后面跟异常对象异常类型是否产生异常会不会数量一次一个可以多个常用于主动检测错误传递异常责任4. finally无论 try 中是否发生异常finally 中的代码通常都会执行。语法 try{// 可能发生异常的代码}catch(异常类型 e){// 处理异常}finally{// 一定执行的代码}例子 :publicclassTest{publicstaticvoidmain(String[]args){try{inta10/0;}catch(Exceptione){System.out.println(捕获异常);}finally{System.out.println(执行finally);}}}final 经常用来关闭资源publicclassTest{publicstaticintgetData(){Scannerinnull;try{innewScanner(System.in);intdatain.nextInt();returndata;}catch(InputMismatchExceptione){e.printStackTrace();}finally{System.out.println(关闭Scanner);in.close();}return0;}publicstaticvoidmain(String[]args){intretgetData();}}如果输入不匹配的数据时发生异常也能关掉资源 ,可以有效减少资源泄露5. 自定义异常类根据业务需求自己创建一个异常类型。例如 : 自定义一个异常类判断年龄的有效范围classInvalidAgeExceptionextendsRuntimeException{publicInvalidAgeException(){super();}publicInvalidAgeException(Stringmessage){super(message);}}classStudent{Stringname;intage;publicStudent(intage,Stringname){try{if(age0||age120){thrownewInvalidAgeException(年龄非法);}this.ageage;this.namename;}catch(InvalidAgeExceptione){e.printStackTrace();}}}publicclassTest{publicstaticvoidmain(String[]args){Students1newStudent(150,pater);}}1.super(message);: 调用父类RuntimeException的构造方法把错误信息保存下来2.如果想写成编译时异常 ,把extends RuntimeException改为extends Exception✅3.处理异常的方式选择try-catch或者throws✅自定义异常类的优点语义清晰异常名直接反映业务含义比如InvalidAgeException便于维护一看异常名就知道问题类型支持分层处理可以针对不同异常做不同处理逻辑提升程序灵活性