Java学习笔记之异常
一、异常处理的重要性
在程序运行时,如果抛出异常,则会导致程序死亡;
越是大型的项目,尽管它会出现异常,但为了不影响使用,是不会在中途停下来的,如果停下来会影响很多人的使用;
而异常的出现往往是不经意之间的,例如:对于用户传入的数值范围的判断失误,就容易让程序出现错误;
所以异常处理是非常重要的一环,如果处理的不好,很有可能会导致服务器崩溃,宕机,损失严重;
二、异常概述
1.什么是异常
程序在编译或运行过程中出现的问题,被称为异常
2.现实生活中的异常举例
Error:程序直接死亡
编译时异常:必须处理
运行时异常:可以不处理
3.异常的继承体系
Throwable:
Error:(全部是错误)
Exception:(全部是异常,可以处理)
编译时异常:
运行时异常:
编译时异常和运行时异常的区分:
RuntimeException及其子类异常都是运行时异常,除了RuntimeException都是编译时异常
编译时异常的特点:
- 方法体中抛出的编译时异常,必须要处理
- 方法声明上声明编译时异常,方法调用者必须处理
运行时异常的特点:
- 方法体中抛出运行时异常,可以处理,也可以不处理
- 方法声明上声明运行时异常,方法调用者可以处理,也可以不处理了
4.异常和错误的区别
错误:
是由操作系统反馈给JVM,属于摧毁性的伤害,如果出现,就只能修改代码,程序直接死亡
异常:
由JVM产生反馈给Java程序,如果针对异常处理,处理之后的代码还可以继续运行,如果不处理异常,Java程序会再次把异常抛给JVM,JVM把异常信息打印在控制台然后杀死程序;
所有异常的子类都是由Exception结尾的,可以对异常处理并继续执行;
如果不是那就是错误,错误只能修改代码;
5.异常的产生过程
三、异常的处理
1.JVM处理异常的方式
- 将异常信息(异常类名、原因、位置)输出到控制台
- 退出JVM,终止程序
2.手动处理
2.1 方法内部来处理(捕获处理异常)
也被称为try—catch处理
try{
//1.把可能有问题的代码放到这里
//2.这里只能执行到出问题的代码那里,剩下所有的代码都不会被执行
}catch(Exception e){
//1.如果上面的代码块出现问题,程序直接跳到这里执行
//2.这里编写存放异常的代码;
//3.catch这部分可以由多个catch处理多个异常,虽然大部分时间为了省事,直接使用Exception全部接受
//但是存在需要多种异常的处理,最主要的还是区分是那里抛出的异常,可以更好的优化代码
}finally{
//1.这里一般存放结束代码,也就是异常处理之后的善后处理
//比如:记录信息、释放资源,结束方法并告诉使用者需要换一个等等
//2.finally没有也可以,也没有任何问题,只不过加上去之后,可以把善后代码和本来正常的代码区分
}
注意事项:
当多个catch的异常存在继承关系,那么父类的异常要放在子类后面,子类之间的异常没有任何先后限制
Finally代码块:
-
特点:
无论发生任何情况,finally中的代码块都会执行,哪怕是return,finally也会在return之前执行;
当然只能是进入了try-catch-finally流程之内的才会这样;
-
作用:
一般用来执行,释放资源的代码(IO流,释放数据库资源)
2.2 把异常抛出,告诉方法的调用者(声明或者抛出处理异常)
2.2.1 throw抛出异常
作用: 将异常对象抛给方法调用者,并结束当前方法得到运行
位置: 方法体中
格式: throw new 异常名称(“异常信息”);
注意: 这个方式虽然可以单独使用,但一般需要配合throws关键字来使用;
这种方式一般用于抛出Java程序检查不出的异常,因为很多时候Java程序允许,但是业务或者自己编写的代码逻辑不允许出现这样的参数,为了提醒自己或者测试或者其他调用者,抛出这样的异常;
2.2.2 throws抛出异常
**作用:**用来申明方法中可能出现的异常 / 将异常表示出来,提醒调用者处理异常
**位置:**方法申明上
格式: 修饰符 返回值类型 方法名 (参数列表) throws 异常名{ }
**注意:**这种方式可以单独使用
3.异常处理的注意事项
1.子类重写方法时,异常类型不能比父类方法声明的异常类型大(只能小于等于)
2.父类没有声明异常,子类出现异常处理方式:
- try–catch处理
- 声明运行时异常
4.异常处理的选择
四、异常中的常用方法
1. public String toString()
获得异常信息字符串:(异常类全名:异常原因字符串)
2. public String getMessage()
获得异常原因字符串
3. public void printStackTrace()
追踪栈异常信息来源
打印异常栈信息
五、自定义异常
自定义异常步骤
1.创建一个类集成Exception或RuntiemException
2.提供两个构造方法
一个无参数构造
一个有参数构造
代码样例:
public class test {
public static void main(String[] args) {
try{
div();
}catch (Exception e){
e.printStackTrace();
}
System.out.println("那就没办法了");
}
public static void div() throws FixException {
System.out.println("heiheihei");
throw new FixException("就是不让你运行");
}
}
public class FixException extends Exception {
public FixException() {
}
public FixException(String message) {
//获取异常出现的原因,或者叫异常信息
super(message);
}
}
上一篇: Windows下CLion配置Android NDK编译环境
下一篇: Java学习之异常机制
推荐阅读
-
Bootstrap布局之栅格系统学习笔记
-
Yii框架学习笔记之应用组件操作示例
-
Python学习笔记整理3之输入输出、python eval函数
-
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
-
Python学习笔记之os模块使用总结
-
7.1(java学习笔记)InetAddress&InetScoketAddress
-
Python学习笔记(一)(基础入门之环境搭建)
-
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
-
Python ORM框架SQLAlchemy学习笔记之关系映射实例
-
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例