1 A.java
/*异常(机制)介绍
* Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.itjinling_01.ExceptionDemo.main(ExceptionDemo.java:5)
我们在写代码的时候,经常的出现一些小问题,那么为了方便我们处理这些问题,java为我们提供了异常机制
异常包含了错误的类型、原因以及位置
异常:不正常,我们在代码的时候出现的编译或者运行时的错误
异常的体系结构:
Throwable(最顶层)
Error:出现的不能够处理的严重问题
Exception:可以处理的问题
电脑坏了:
系统中毒:重装系统就可以了 exception
主板坏了:买一台新的 error
*
*/public class A {public static void main(String[] args) {/*int a = 10 / 0;//编译正常System.out.println(a); //运行异常 :Exception in thread "main" java.lang.ArithmeticException: / by zeroat com.itjinling_01.ExceptionDemo.main(ExceptionDemo.java:5)*/ // FileWriter fw = new FileWriter("a.txt"); //编译错误 , 需要在方法中抛出异常} }
2 B.java
* 异常的处理方式:
捕获处理:见C.java
try...catch语句
抛出去 :见D.java
throws
*
*
* jvm处理异常的方式:
* 如果出现异常我们没有处理,jvm会帮我们进行处理,他会把异常的类型,原因还有位置显示在命令行
* 并且还终止了程序,异常后面的代码将不在执行public class B {public static void main(String[] args) throws Exception {System.out.println(2/0);System.out.println("hello");} }
3 C.java
* 异常的处理方式:
* 捕获处理
* try...catch语句
*
* try {
* 有可能出现问题的代码;
* } catch(ArithmeticException ae) {
* 处理异常;
* }
*
* try...catch的执行顺序:
* 首先执行try语句
* 如果发现异常,异常下面的代码不在执行,直接跳入catch语句中,catch语句结束后,整个try...catch结束
* 如果没有发现异常,try语句执行结束后,try...catch直接结束, 不在执行catch语句
*
* jvm处理异常的方式:
* 如果出现异常我们没有处理,jvm会帮我们进行处理,他会把异常的类型,原因还有位置显示在命令行
* 并且还终止了程序,异常后面的代码将不在执行
*/
public class C {public static void main(String[] args) throws Exception {try {System.out.println(1);System.out.println(2 / 0);//这段报错的代码后面的代码不会执行!System.out.println(2);} catch (ArithmeticException ae) {System.out.println("除数不能为0");}System.out.println(3);}}
4 D.java
* 异常的处理方式:
* 捕获处理
* try...catch语句
*
* try {
* 有可能出现问题的代码;
* } catch(ArithmeticException ae) {
* 处理异常;
* }
*
* try...catch的执行顺序:
* 首先执行try语句
* 如果发现异常,异常下面的代码不在执行,直接跳入catch语句中,catch语句结束后,整个try...catch结束
* 如果没有发现异常,try语句执行结束后,try...catch直接结束, 不在执行catch语句
*
*
* 抛出去throws
* 当我们不想处理异常,或者没有能力处理的时候,我们可以选择抛出异常,谁调用方法谁处理异常
* 使用关键字throws在方法的声明出抛出异常*
*
* jvm处理异常的方式:
* 如果出现异常我们没有处理,jvm会帮我们进行处理,他会把异常的类型,原因还有位置显示在命令行
* 并且还终止了程序,异常后面的代码将不在执行public class D {public static void main(String[] args) throws IOException {method();function();}public static void function() throws IOException {FileWriter fw = new FileWriter("src/day37/a.txt");fw.write("aSA");fw.flush();fw.close();}private static void method() {try {System.out.println(1);//System.out.println(2 / 0);System.out.println(2);} catch(ArithmeticException ae) {System.out.println("除数不能为0");}System.out.println(3);} }
补充题外话,确定相对路径的小技巧:
(eclipse软件的相对路径在java项目根目录下开始,vscode的会有提示比较方便)
①new FileWriter(a.txt)看生成在哪里
②File f2 = new File("a.txt"); 与
System.out.println(f2.getAbsolutePath()); or
System.out.println(f2.getAbsoluteFile());输出绝对路径。
5 E.java
* 如何处理多个异常:
* 可以使用多个try...catch语句
* 使用一个try和多个catch
*
* 多个catch之间的顺序:
* 多个catch之间可以有子父类,如果有子父类,父类异常必须放在后面 ,Exception就是最大的父类,,需要放在最后面的catch
* 平级之间没有顺序关系: NullPointerException,ArrayIndexOutOfBoundsException
*
*public class E {public static void main(String[] args) {method();System.out.println("---------");metho2();}private static void metho2() {try {String s = null;System.out.println(s.length());int[] arr = new int[5];System.out.println(arr[8]);System.out.println(2 / 0);} catch(NullPointerException e) {System.out.println("出现空指针了");}catch(ArrayIndexOutOfBoundsException e) {System.out.println("出现数组越界了");} catch(Exception e) {System.out.println("出现异常了");}try {} catch(ArrayIndexOutOfBoundsException e) {System.out.println("出现数组越界了");}}private static void method() {try{String s = null;System.out.println(s.length());} catch(NullPointerException e) {System.out.println("出现空指针了");}try {int[] arr = new int[5];System.out.println(arr[8]);} catch(ArrayIndexOutOfBoundsException e) {System.out.println("出现数组越界了");}}}
6 F.java
* Throwable的常用方法:
String getMessage() 原因
String toString() 类型和原因
void printStackTrace() 类型原因和位置public class F {public static void main(String[] args) {// method();System.out.println("----------");}private static void method() {try {System.out.println(2 / 0);} catch(ArithmeticException e) {//String getMessage() : 原因System.out.println(e.getMessage()); /// by zero//String toString() 类型和原因System.out.println(e.toString()); //java.lang.ArithmeticException: / by zero//void printStackTrace():类型原因和位置e.printStackTrace();/*报错如下:java.lang.ArithmeticException: / by zerohello----------at day37.F.method(F.java:30)at day37.F.main(F.java:13)*/}System.out.println("hello");//注意是在try那边如果有报错才会停止下面的代码,不是catch}}
7 G.java
* finally:组合try...catch使用,用于释放资源等收尾工作,无论try...catch语句如何执行,finally的代码一定会执行
*
* try {
* 有可能出现问题的代码;
*
* } catch(异常对象) {
* 处理异常;
* } finally {
* 释放资源;
* 清理垃圾;public class G {public static void main(String[] args) throws IOException { // method(); // System.out.println("--------------");FileWriter fw = null;try {fw = new FileWriter("src/day37/a.txt");fw.write("hello");fw.write("world");fw.flush();System.out.println(2 / 0);// ,Exception in thread "main" java.lang.ArithmeticException: / by zero // 下面代码运行不了 所以关闭不了资源,所以在finally里面关闭fw.write("java");fw.flush();fw.close();} catch (IOException e) {e.printStackTrace();} finally {//释放资源fw.write("11aa11");fw.close(); // fw.write("abc"); 会报错 说资源已关闭}}private static void method() {try {System.out.println(2 / 0);} catch(ArithmeticException e) {System.out.println("除数不能为0");} finally {System.out.println("清理垃圾");}} }