知识屋:更实用的电脑技术知识网站
所在位置:首页 > 教育

Java小白学习之路(Java基础)Day10

发表时间:2022-03-25来源:网络

Day10

异常

什么是异常

异常是指由于程序中的错误而导致正常的程序流程中断的一种事件。如:除数为0,数组越界,文件找不到等都属于异常。

Java异常分类

从理论的角度Java中异常分为两类,分别为 :

Error(错误):JVM系统内部错误、资源耗尽等严重情况

Exception(异常):因编程错误或偶然的外在因素导致的一般性问题,例如:对负数开平方根、空指针访问、试图读取不存在的文件、网络连接中断等。

从编程角度考虑可以将异常(Exception)分为以下两类 :

非检查型(unchecked)异常 :是指编译器不要求强制处置的异常,该异常是因设计或实现方式不当导致的问题,是程序员的原因导致的,可以避免这种问题的产生

检查型(checked)异常 :是指编译器要求必须处置的异常,是程序在运行时由于外界因素造成的一般性异常,该类异常是Exception类型及其子类(RuntimeException类及其子类除外)

从开发应用角度考虑可以将异常分为以下两类 :

系统异常:系统异常在性质上比应用异常更加严重,前者通常和应用逻辑无关,而是底层出现了问题,如数据库服务器的异常终止等。

应用异常:应用异常是由于违反了商业规则或者业务逻辑而导致的错误。例如,一个被锁定的用户试图登入应用。

Java中的异常体系

Java异常处理机制

Java语言提供两种处理异常的机制:

捕获异常 :在程序运行过程中系统得到一个异常对象时,它将会沿着方法的调用栈逐层回溯,寻找处理这一异常的代码,找到处理这种类型异常的方法后,运行时系统把当前异常对象交给这个方法进行处理,该过程称为捕获(catch)异常。

声明抛出异常 :当运行时系统得到一个异常对象,如果当前方法并不知道如何处理所出现的异常或者此时处理不合适,则可在定义方法时,声明抛出(throws)异常。

异常处理

Java中关于异常处理涉及到关键字:try、catch、finally、throw和throws

异常实例

使用0做除数而引发的ArithmeticException的异常情况

public class ExceptionDemo { public static void main(String[] args) { // 0做除数 int i = 12 / 0; System.out.println("结果是:" + i); } } 执行结果如下:

Exception in thread “main” java.lang.ArithmeticException: / by zero
at com.dh.ch06.ExceptionDemo.main(ExceptionDemo.java:8)

try/catch

在Java程序中,如果在出现异常的地方进行异常处理,可以在方法中添加两类代码块,即try、catch,通常发生异常的代码都放在try代码块中,try代码块中包含的是可能引起一个或者多个异常的代码;

try代码块的功能就是监视异常的发生。如果try块中的代码产生异常时则由catch块进行捕获并处理,也就是说catch代码块中的代码用于处理try代码块中抛出的具体异常类型的异常对象。

语法格式如下:

try {
// 代码段(可能发生异常的代码)
} catch (Throwable ex) {
// 对异常进行处理的代码段
}

实例:

public class TryCatchDemo { public static void main(String[] args) { //定义一个String变量,值为null String str = null; try { i f ( str.equals("hello") ) { System.out.println("hello java"); } } catch (NullPointerException e) { System.out.println("空指针异常"); } } } 多重catch处理异常

在一个程序中可能会引发多种不同类型的异常,此时可以提供多个catch语句用来捕获用户感兴趣的异常。当引发异常时,程序会按顺序来查看每个catch语句块,并执行第一个与异常类型匹配的catch语句块,其后的catch语句块将被忽略。

语法格式如下:

try {
// 代码段
// 产生异常(异常类型2)
} catch (异常类型1 ex) {
// 对异常进行处理的代码段
} catch (异常类型2 ex) {
// 对异常进行处理的代码段
} catch (异常类型3 ex) {
// 对异常进行处理的代码段
}

实例:

public class NestedExceptionDemo { public static void main(String[] args) { try { try { Scanner scanner = new Scanner(System.in); // 从控制台中传入两个参数 int number1 = Integer.parseInt(scanner.next()); int number2 = Integer.parseInt(scanner.next()); // 求商运算 double result = number1 / number2; System.out.println("the result is " + result); } catch (NumberFormatException e) { System.out.println("数字格式转换异常!"); } } catch (ArithmeticException e) { System.out.println("0做除数无意义!"); } } }

控制台输入“aaa”,演示结果如下:
aaa
数字格式转换异常!
this is the end flag!

finally

在某些特定的情况下,不管是否有异常发生,总是要求某些特定的代码必须被执行,比如进行数据库连接时,不管对数据库的操作是否成功,最后都需要关闭数据库的连接并释放内存资源。这就需要用到finally关键字,finally不能单独使用必须和try结合使用,有两种用法:

try-finally

try-catch-finally (较为常用)

语法格式如下:

try {
// 代码段(可能发生异常代码)
} catch (Throwable ex) {
// 对异常进行处理的代码段
} finally {
// 总要被执行的代码
}

实例:

public class FinallyDemo { public static void main(String[] args) { System.out.println("请打开数据库连接......"); try { System.out.println("执行查询操作"); System.out.println("执行修改操作"); // 使用0做除数 int i = 12 / 0; System.out.println("结果是:" + i); } catch (Exception ex) { System.out.println("除零出错!"); } finally { System.out.println("关闭数据库连接......"); } } }

执行结果如下:
请打开数据库连接…
执行查询操作
执行修改操作
除零出错!
关闭数据库连接…

throw/throws

在Java程序中如果要明确地引发异常,则需要用到throw或throws语句 :

throw语句 :throw语句用来明确地抛出一个“异常”。

throws语句:如果一个方法methodName()可以引发异常,而它本身并不对该异常进行处理,那么该方法必须声明将这个异常抛出,以使程序能够继续执行下去。这时候就要用到throws语句。

throws语句的格式如下:

returnType methodName() throws ExceptionType1,ExceptionType2 {
// body
}

自定义异常

Java语言本身提供的异常太贴近于技术,很多情况下需要构建自己的业务异常体系。

如下自定义一个异常类ZeroDivideException:

public class ZeroDivideException extends Exception { public ZeroDivideException() { super(); } public ZeroDivideException(String msg) { super(msg); } public ZeroDivideException(Throwable cause) { super(cause); } public ZeroDivideException(String msg, Throwable cause) { super(msg, cause); } }

下述代码对ZeroDivideException自定义异常类进行测试。

public class ZeroDivideExceptionDemo { /* 测试方法如下 */ public static void main(String[] args) { try { int result = divide(10, 0); System.out.println("结果是:" + result); } catch (ZeroDivideException ex) { // 打印异常信息 System.out.println(ex.getMessage()); // 打印异常栈信息 ex.printStackTrace(); } } /* ZeroDivideException的使用方法 */ public static int divide(int oper1, int oper2) throws ZeroDivideException { if (oper2 == 0) { throw new ZeroDivideException("0做除数无意义!"); } return oper1 / oper2; } }

ex.printStackTrace();
}
}
/* ZeroDivideException的使用方法 */
public static int divide(int oper1, int oper2) throws ZeroDivideException {
if (oper2 == 0) {
throw new ZeroDivideException(“0做除数无意义!”);
}
return oper1 / oper2;
}
}

收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜