1.异常
1.1认识异常
什么是异常?
- 异常代表程序出现的问题。
读取的文件不存在了
读取网络数据,结果断网了
...
异常的作用?
- 异常是用来定位程序bug的关键信息,可以让我们快速打补丁。(会有一个异常文件,我们可以看异常文件)
- 可以作为方法内部的一种特殊返回值,以便通知上层调用者,方法的执行问题。
这就是异常作为方法内部一种特殊返回值的实例,我们看运行结果就能知道问题所在,它的作用显而易见。
如果我们的参数正确,也完全不会影响我们程序执行。
1.1.1运行时异常
- ArrayIndexOutOfBoundsException 越界异常
- ArithmeticException 算数异常
- NullPointerException 空指针异常
1.1.2编译时异常
//定义一个方法,认识编译时异常public static void show02(){//编译异常:编译阶段报错,源代码中,有语法错误,无法通过编译。System.out.println("程序开始");String str="2021-11-02 19:25:31";//把字符串时间解析成Java中的一个日期对象。SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = sdf.parse(str);System.out.println(date);System.out.println("程序结束");}
1.2自定义异常
- Java无法为这个世界上全部的问题都提供异常类来表示,如果企业自己的某种问题(比如发现你这个用户不是VIP),想通过异常来表示,以便用异常来管理该问题,那就需要自己来定义异常类了。
- 那自定义异常肯定需要认爸爸,也就是继承RuntimeException运行时异常,或继承编译时异常Exception。
1.2.1自定义运行时异常
- 定义一个异常类继承RuntimeException。
- 重写构造器。
- 通过throw new异常类(xxx)来创建异常对象并抛出。
- 特点:编译阶段不报错,运行时才可能出现!提醒不属于激进型。
我们现在测试一下,年龄参数有问题运行程序会出现什么结果。
1.2.2自定义编译时异常
- 定义一个异常类继承Exception。
- 重写构造器。
- 通过throw new异常类(xxx)创建异常对象并抛出。
- 特点:编译阶段就报错,提醒比较激进。
我们现在测试一下,年龄参数有问题运行程序会出现什么结果。
现在sun公司包括实际的java开发使用编译类异常的可能性都在减少,因为编译时异常的侵略性太过严重,因为不管谁碰到了,都需要强制的抛出异常或者处理,现在的项目出现异常的概率也会小很多,所以现在java在全面摒弃编译时异常,所以还是推荐大家使用运行时异常。
1.3异常的处理方案
1.3.1异常的基本处理
抛出异常(throws)
- 在方法上使用throws关键字,可以将方法内部出现的异常抛出去给调用者处理。
捕获异常(try...catch)
- 直接捕获程序出现的异常
这是第一种情况,我们利用try...catch,但是代码正确,所以不会触发打印这个异常信息。
现在我们试一下如果故意把编译时异常提示的代码写错会发生什么。
那如果一个方法里,可能会出现两种编译时异常我们如何处理呢?
我们可以同时抛两个,或者我们直接把异常类型写成Exception,因为Exception是所有异常的爹。
1.3.2异常的处理方案
方案1(现在项目开发最推荐使用的)
- 底层异常层层往上抛出,最外层捕获异常,记录下异常信息,并响应适合用户观看的信息进行提示。
方案2
- 最外层捕获异常后,尝试重新修复。