导图社区 Java异常处理
这是一篇关于Java异常处理的思维导图,主要内容有一、异常概述二、处理程序异常错误三.Java常见异常四、自定义异常等。
编辑于2022-12-08 17:39:39 贵州微信小程序开发知识整理,系统地介绍了微信小程序开发的基础知识,帮助开发者更好地理解和掌握小程序开发的要点和流程。
SpringFramework技术的介绍,SpringFramework,通常简称为Spring,是一个开源的企业级Java应用程序框架,由Rod Johnson创建,并于2004年首次发布。Spring Framework的主要目标是简化企业级Java开发,提高开发效率和应用程序的可维护性。
Maven的特性以及使用部署方法,Maven介绍:Maven是一款为Java项目构建管理、依赖管理的工具(软件),使用Maven可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。
社区模板帮助中心,点此进入>>
微信小程序开发知识整理,系统地介绍了微信小程序开发的基础知识,帮助开发者更好地理解和掌握小程序开发的要点和流程。
SpringFramework技术的介绍,SpringFramework,通常简称为Spring,是一个开源的企业级Java应用程序框架,由Rod Johnson创建,并于2004年首次发布。Spring Framework的主要目标是简化企业级Java开发,提高开发效率和应用程序的可维护性。
Maven的特性以及使用部署方法,Maven介绍:Maven是一款为Java项目构建管理、依赖管理的工具(软件),使用Maven可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。
Java异常处理
一、 异常概述
在程序中,错误可能产生于程序员没有预料到的各种情况,或者是超出了程序员可控范围的环境因素,如用户的坏数据、试图打开一个根本不存在的文件等。在Java中这种在程序运行时可能出现的一些错误称为异常。异常是一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指令流。
实例代码: package com.cxk; public class Baulk { public static void main(String[] args) { int i=6/0; System.out.println(i); } }
运行结果: Exception in thread "main" java.lang.ArithmeticException: / by zero at com.cxk.Baulk.main(Baulk.java:5)
程序运行的结果报告发生了算术异常ArithmeticException(根据给出的错误提示可知发生错误是因为在算术表达式“3/0”中,0作为除数出现),系统不再执行下去,提前结束。这种情况就是所说的异常。 有许多异常的例子,如空指针、数组溢出等。Java语言是一门面向对象的编程语言,因此,异常在Java语言中也是作为类的实例的形式出现的。当某一方法中发生错误时,这个方法会创建一个对象,并且把它传递给正在运行的系统。这个对象就是异常对象。通过异常处理机制,可以将非正常情况下的处理代码与程序的主逻辑分离,即在编写代码主流程的同时在其他地方处理异常。
二、 处理程序异常错误
为了保证程序有效的执行,需要对发生的异常进行相应的处理。在Java中,如果某个方法抛出异常,既可以在当前方法中进行捕捉,然后处理该异常,也可以将异常向上抛出,由方法调用者来处理。
1||| 错误:异常产生后,如果不做任何处理,程序就会被终止。例如,将一个字符串转换为整型,可以通过Integer类的parseInt()方法来实现。但如果该字符串不是数字形式,parseInt()方法就会抛出异常,程序将在出现异常的位置终止,不再执行下面的语句
实例代码: package com.cxk; public class Surprise { public static void main(String[] args) { String s=new String("cxk"); int age=Integer.parseInt("18L"); System.out.println("名称:"+s+"年龄:"+age); } }
运行结果: Exception in thread "main" java.lang.NumberFormatException: For input string: "18L"at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.base/java.lang.Integer.parseInt(Integer.java:652) at java.base/java.lang.Integer.parseInt(Integer.java:770) at com.cxk.Surprise.main(Surprise.java:6)
NumberFormatException:数值转换异常
2||| 捕捉异常:Java语言的异常捕获结构由try、catch和finally 3部分组成。其中,try语句块存放的是可能发生异常的Java语句;catch程序块在try语句块之后,用来激发被捕获的异常;finally语句块是异常处理结构的最后执行部分,无论try语句块中的代码如何退出,都将执行finally语句块。
实例代码: package com.cxk; public class Surprise { public static void main(String[] args) { try { //测试代码是否有异常 String s = new String("cxk"); int age = Integer.parseInt("18L"); System.out.println("名称:" + s + "年龄:" + age); }catch (Exception e) //捕捉异常 { e.printStackTrace(); //如果捕捉到异常则打印异常性质 } finally { System.out.println("程序结束"); } } }
有时为了编程简单会忽略catch语句后的代码,这样try-catch语句就成了一种摆设,一旦程序在运行过程中出现了异常,就会导致最终运行结果与期望的不一致,而错误发生的原因很难查找。因此要养成良好的编程习惯,最好在catch代码块中写入处理异常的代码。
程序仍然输出最后的提示信息,没有因为异常而终止。在例12.3中将可能出现异常的代码用try-catch语句块进行处理,当try代码块中的语句发生异常时,程序就会调转到catch代码块中执行,执行完catch代码块中的程序代码后,将继续执行catch代码块后的其他代码,而不会执行try代码块中发生异常语句后面的代码。由此可知,Java的异常处理是结构化的,不会因为一个异常影响整个程序的执行。
Exception是try代码块传递给catch代码块的变量类型,e是变量名。catch代码块中语句“e.printStackTrace();”用于输出错误性质。通常,异常处理常用以下3个函数来获取异常的有关信息。
(1) getMessage()函数:输出错误性质
(2) toString()函数:给出异常的类型与性质
(3) printStackTrace()函数:指出异常的类型、性质、栈层次及出现在程序中的位置
3||| finally语句块:完整的异常处理语句一定要包含finally语句,无论程序中有无异常发生,并且无论try-catch语句是否顺利执行完毕,都会执行finally语句,但在以下4中特殊情况下,finally块不会被执行。
1||| 在finally语句块中发生了异常
2||| 在前面的代码中使用了System.exit()退出程序
3||| 程序所在的线程死亡
4||| 关闭CPU
三、 Java常见异常
在Java中提供了一些异常用来描述经常发生的错误,其中,有的需要程序员进行捕获处理或声明抛出,有的是由Java虚拟机自动进行捕获处理的。常见的异常类有:
1||| ClassCastException:类转换异常
2||| ClassNotFoundException:未找到相应类异常
3||| ArithmeticException:算数异常
4||| ArrayIndexOutOfBoundsException:数组下标越界异常
5||| ArrayStoreException:数组中包含不兼容的值抛出的异常
6||| SQLException:操作数据库异常类
7||| NullPointerException:空指针异常
8||| NoSuchFieldException:字段未找到异常
9||| NoSuchMethodException:方法未找到抛出的异常
10||| NumberFormatException:字符串转换为数字抛出的异常
11||| NegativeArraySizeException:数组元素个数为负数抛出的异常
12||| StringIndexOutOfBoundsException:字符串索引超出范围抛出的异常
13||| IOException:输入输出异常
14||| IllegalAccessException:不允许访问某类异常
15||| InstantiationException:当应用程序试图调用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常
16||| EOFException:文件已结束异常
17||| FileNotFoundException:文件未找到异常
四、 自定义异常
使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户只需继承Exception类即可自定义异常类。在程序中使用自定义异常类,大体可分为以下几个步骤:
1||| 创建自定义异常类
2||| 在方法中通过throw关键字抛出异常对象
3||| 如果在当前抛出异常的方法中处理异常,可以使用try-catch语句块捕获并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作
4||| 在出现异常方法的调用者中捕获并处理异常
自定义异常类实例代码: package com.cxk; public class MyException extends Exception{ //创建自定义异常,继承Excep类 public MyException(String ErrorMessage) //构造方法 { super(ErrorMessage); //父类构造方法 } }
字符串ErrorMessage是要输出的错误信息,若想抛出用户自定义的异常对象,要使用throw关键字
实例代码: package com.cxk; public class Tran { static int avg(int a,int b)throws MyException //定义方法抛出异常 { if(a<0||b<0) { throw new MyException("不能为负数"); } if (a>100||b>100) { throw new MyException("数值太大。"); } return (a+b)/2; //返回参数平均值 } public static void main(String[] args) { try { //检测可能出现异常的代码 int i=avg(1,115); //调用avg()方法 System.out.println(i); //将返回值输出 }catch (MyException e) { System.out.println(e); //输出异常信息 } } }
创建类Tran,该类中创建一个带有int型参数的方法avg(),该方法用来检查参数是否小于0或大于100。如果参数小于0或大于100,则通过throw关键字抛出一个MyException异常对象,并在main()方法中捕捉该异常
运行结果: com.cxk.MyException: 数值太大。
五、 在方法中抛出异常
若某个方法可能会发生异常,但不想在当前方法中处理这个异常,则可以用throws、throw关键字在方法中抛出异常
1. 使用throws关键字抛出异常:throws关键字通常被应用在声明方法时,用来指定方法可能抛出的异常。多个异常可以用逗号分隔开
实例代码: package com.cxk; public class Shoot { static void pop()throws NegativeArraySizeException { //定义方法并抛出NegativeArraySizeException异常 int []arr=new int[-6]; //创建数组 } public static void main(String[] args) { try{ pop(); //调用pop方法 }catch (NegativeArraySizeException e) { System.out.println(e); } } }
使用throws关键字将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。
运行结果: java.lang.NegativeArraySizeException: -6
如果是Error、RuntimeException或它们的子类,可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。
2. 使用throw关键字抛出异常:throw关键字通常用于方法体中,并且跑出一个异常对象。程序在执行到throw语句时立即终止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法的声明中指明要抛出的异常;如果要捕捉throw抛出的异常,则必须使用try-catch语句块
package com.cxk; public class MyException extends Exception{ //创建自定义异常,继承Excep类 String message; public MyException(String ErrorMessage) //构造方法 { message=ErrorMessage; //父类构造方法 } public String getMessage() { return message; //覆盖getMessage()方法 } }
package com.cxk; public class Captor { public static int quotient(int x,int y)throws MyException { if (y<0) { throw new MyException("除数不能为负数"); } return x/y; } public static void main(String[] args) { try { int i=quotient(5,-1); }catch (MyException e) { System.out.println(e.getMessage()); }catch (ArithmeticException e) { //处理算数异常 System.out.println("除数不能为0"); }catch (Exception e) { System.out.println("这是其它异常"); } } }
实例使用了多个catch语句来捕捉异常。如果调用quotient(5,-1)方法,将发生MyException异常,程序调转到catch (MyException e)代码块中执行;如果调用quotient(5,0)方法,会发生ArithmeticException异常,程序调转到catch(ArithmeticException e)代码块中执行;如还有其他异常发生,将使用catch(Exception e)捕捉异常。由于Exception是所有异常类的父类,如果将catch(Exception e)代码块放在其他两个代码块的前面,后面的代码块将永远得不到执行,也就没有什么意义了,所以catch语句的顺序不可调换。
六、 运行时异常
RuntimeException异常是程序运行过程中产生的异常。Java类库的每个包中都定义了异常类,所有这些类都是Throwable类的子类。Throwable类派生了两个子类,分别是Exception和Error类。Error类及其子类用来描述Java运行系统中的内部错误以及资源耗尽的错误,这类错误比较严重。Exception类称为非致命性类,可以通过捕捉处理使程序继续执行。Exception类又根据错误发生的原因分为RuntimeException异常和除RuntimeException之外的异常,其关系如右图所示
七、 异常使用的原则
Java异常强制用户去考虑程序的强健性和安全性。异常处理不应用来控制程序的正常流程,其主要作用是捕获程序在运行时发生的异常并进行相应的处理。编写代码处理某个方法可能出现的异常时,可遵循以下几条原则:
1||| 在当前方法声明中使用try-catch语句捕获异常
2||| 一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类
3||| 如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常