键盘敲烂,月薪过万作业不做,等于没学
当前系列: J&C 修改讲义

复习:异常:概念明晰 / throw / try...catch / finally / 性能


异常类型

万物皆对象。

Java/C#需要将异常信息封装成对象,并内置了很多很多的Exception类。

Java中的RuntimeExcepition和C#中的Exception类似,最主要的成员包括:
  • Message:异常消息,属性,可以使用构造函数传入;
    } catch (RuntimeException e) {
    	System.out.println(e.getMessage());
    throw new RuntimeException("成绩不能小于0或大于100");
  • StackTrace:堆栈信息,即方法的层层调用关系,属性;
    System.out.println(e.getStackTrace());
  • ToString:重写Object的方法,可以输出更详细的错误信息,而不是简单的类名信息
    System.out.println(e.toString());
  • Cause/InnerException:导致当前异常产生的、位于当前异常内部的异常
    throw new RuntimeException("成绩不能小于0或大于100", 
    		new NullPointerException());
    System.out.println(e.getCause());

常见异常类

Exception下还有一些子类,常见的有:

  • 空引用异常:NullPointerException
  • 数组越界异常:IndexOutOfBoundsException
  • 参数异常:ArgumentException


自定义异常

声明一个类,继承自Exception,就可以得到一个自定义异常。

class AbsenceException extends RuntimeException{



分类catch

所以我们可以抛出特定的异常:

throw new IllegalArgumentException("成绩不能小于0或大于100");

捕获时也可以指定异常的类型:

} catch (IllegalArgumentException e) {

还可以根据不同的异常类型,进行不同的处理(让不同的Exception被不同的catch块处理)

} catch (IllegalArgumentException e) {
    System.out.println("IllegalArgumentException 异常被捕获");
} catch (Exception e) {
    System.out.println("Exception 异常被捕获");

注意:越是具体(子类)的异常,越是要放在前面,否则编译无法通过,因为子类异常也会直接被之前的父类catch捕获。


使用选择

throw...try...catch:

异常,什么时候抛出(throw)?什么时候捕获(catch)?捕获之后怎么处理?

  • 不知道怎么处理的,就不要处理
  • 不要catch之后,啥都不做(或者就包裹一下),直接throw
  • 总是在程序入口(顶层方法)处catch未捕获的异常

finally:如果仅仅是为了释放资源,推荐使用语法糖:try...with(Java)或using块(C#)


作业

在学习完C#/Java各自语法后完成:
  1. 修改之前的属性验证:problem.Reward为负数时直接抛出“参数越界”异常
  2. 内容(Content)发布(Publish)的时候检查其作者(Author)是否为空,如果为空抛出“参数为空”异常
  3. ContentService中捕获异常
    1. 如果是“参数为空”异常,控制台输出:内容的作者不能为空,将当前异常封装进新异常的InnerException,再将新异常抛出
    2. 如果是“”参数越界”异常,控制台输出:求助的Reward为负数(-XX),不再抛出异常
  4. ContentService中无论是否捕获异常,均要控制台输出:XXXX年XX月XX日 XX点XX分XX秒(当前时间),请求发布内容(Id=XXX)
  5. 在入口函数调用ContentService时,捕获一切异常,并记录(控制台输出)异常的消息和堆栈信息
学习笔记
源栈学历
大多数人,都低估了编程学习的难度,而高估了自己的学习能力和毅力。

作业

觉得很 ,不要忘记分享哟!

任何问题,都可以直接加 QQ群:273534701

在当前系列 J&C 中继续学习:

多快好省!前端后端,线上线下,名师精讲

  • 先学习,后付费;
  • 不满意,不要钱。
  • 编程培训班,我就选源栈

更多了解 加:

QQ群:273534701

答疑解惑,远程debug……

B站 源栈-小九 的直播间

写代码要保持微笑 (๑•̀ㅂ•́)و✧

公众号:源栈一起帮

二维码