异常的分类
错误:
error 这是无法throw的问题,如内存溢出
异常:
Exception 编译期问题,可以throw或者try catch
RuntimeExeption 运行期间出现的问题,可以throw或者try catch
运行期异常的分类:
1、
运行期异常可以是由于数据逻辑错误产生,举例:空指针异常。如果没有提前定义,系统在识别异常后一定会中断程序。如果提前写try datch可以使程序继续运行。
2、
运行期异常是由程序员自定义的。比如提前预知了某个异常出现,在异常中添加注释方便排查问题。也可以是人为地定义一些正常的情况为异常,强制中断程序(说实话我实在想不通为什么不直接写return难道有人就是觉得红色字体比较好看???这里边有些是IOException等等都是有分类的,分类有什么用?不知道!!!)自定义exception以后不能再往下继续写代码了。
以上展示了自定义异常运行的结果
异常的定义
关键字throw的用法
必须写在方法内部
必须是exception的子类
如果不是runtime exception必须在方法后面写throws或者try catch
相关方法:objects.requireNonNull可以判断是否制定元素为空并且抛出异常
throws
异常抛出。如果某个方法有“throws”小尾巴,那么调用这个方法的方法,最好是写个try catch,或者继续thows。如果在整个方法调用的过程中没有任何一个方法写try catch,到最后java就会进行中断处理。
try catch
注意,每个try可以有多个catch。如果每个方法里有多个异常,可以分别使用多个catch语句来捕获。如果这些异常之间存在子父类关系,必须把子类写在前面,父类写在后面。或者干脆就不要写子类,直接写父类。
最省事的方法就是写
catch (Exception e)
这个语句会自动捕获所有的异常
三种打印异常的方法
有三种异常打印的方法,第一种是输出红色字体,第二和第三种本质上都是生成字符串,但是字符串附带的信息不同。
public class Lesson {
public static void main(String[] args)
{
try {
a();
} catch (Exception e) {
System.out.println("第一种打印异常的方法");
e.printStackTrace();
System.out.println("第二种打印异常的方法"+e.getMessage());
System.out.println("第三种打印异常的方法"+e.toString());
}
}
public static void a() throws Exception {
System.out.println("程序开始");
throw new Exception("自定义异常产生的原因");
}
}
异常结束
finally语句表示不管是否出现异常都要执行。实际上,只要你写在try语句结束后,就能实现这个效果。所以finally事实上仅仅用于处理IO流。该问题后边补充。证据如下。
public class Lesson {
public static void main(String[] args)
{
try {
a();
} catch (Exception e) {
}finally{
System.out.println("finally模块执行");
}
System.out.println("后续代码");
}
public static void a() throws Exception {
throw new Exception("自定义异常产生的原因");
}
}
注意:
1、在try语句中定义的变量在finally中也无法应用
2、尽量不要在finally中写return语句,思维逻辑容易混乱。try和finally中同时有return时java会忽略try中的return,只识别finally中的return。
其他问题
1、如果extend了某个父类,如果父类没有声明某个异常,子类也不能声明。(这个规定有什么用?)
自定义异常类
作用:相当于给Exception或者RnutimeException换了个名字,方便看一点,显得代码高大上,不用每次报错都看一大堆报错信息才知道错误是什么。
如何创建:
定义一个普通类,继承Exception或者RnutimeException,包含一个空参数的构造方法,和一个包含异常信息的构造方法。使用super(message)。