Java-异常--基本知识点解析---

1.什么是异常
异常是指 在程序的运行过程中所发生的bu正常的事件,它会中断正在运行的程序
程序运行异常 程序中断运行
Java编程语言使用异常处理机制为程序提供了错误处理的能力
2.什么是异常处理
程序中预先设置好对付异常的处理办法 程序运行 异常
对异常进行处理 处理完毕,程序继续运行
3.Java中如何进行异常处理
Java的异常处理是通过5个关键字来实现的:try catch finally throw throws
try 执行可能异常的代码
catch 捕获异常
finally 无论是否发生异常,代码总能执行
声明异常throws 声明方法可能抛出的各种异常
抛出异常throw 手动抛出异常

try-catch
使用try-catch块捕获异常,分三种情况
第一种 正常
用try {} 来运行可能会出现异常的代码
使用catch来捕获所有可能产生的异常的类型
没有出错的情况下 是不会执行catch块中的内容
public void method(){
try{
//代码块(此处不会产生异常)
}catch(异常类型 ex){
//对异常进行处理的代码段
}
//代码段
}
第二种 try 中出现异常 将会执行catch块中的内容
public void method(){
try{

//代码段1
//产生异常的代码段2
//代码段3}

}catch(异常类型 ex){
//对异常进行处理的代码段4
}

//代码段5
}
异常是一种特殊的对象,类型为java.lang.Exception或其子类
try >发生异常>产生异常对象>异常类型匹配>>进入catch块 程序继续执行>>catch>>try-catch块后的代码块

pintStackTrace()的堆栈跟踪功能显示出程序运行到当前类的执行流程
异常堆栈信息
java.util.inputMismatchException 异常类型
at.java.util.Scanner.throwFor(Scanner.java:840)
at.java.util.Scanner.next(Scanner.java:1461)
at.java.util.Scanner.nextInt(Scanner.java:2050)
at cn.jbit.exception.Test3.main(Test3.java:15)
在main方法中出现了异常 ,异常的位置

第三种 异常类型不匹配
我们捕获的异常 和 出现的异常 不匹配 倒置没有捕获到 所以我们的程序仍然是会中断的
public void method(){
try{
//代码段1
//产生异常代码段2
//代码段3
}catch(异常类型 ex){
//对异常进行处理的代码段4
}
//代码段5
}
try > 发生异常> 产生异常对象 >> 异常类型不匹配>>程序中断运行
catch

在catch块中处理异常
加入用户自定义处理信息
System.out.println(“出现错误:被除数和除数必须是整数”);
调用方法输出异常信息
e.printStackTrace();
异常对象常用的方法

方法 说明
Void printStackTrace() 输出异常的堆栈信息
String getMessage() 返回异常信息描述字符串,
是printStackTrace()输出信息的一部分

常见的异常类型
异常类型 说明
Exception 异常层次结构的父类
ArithmeticException 算术错误,如以零作除数
ArrayIndexOutOfBoundsException 数组下标越界
NullPointerException 尝试访问null对象成员
ClassNotFoundException 不能加载所需的类
IIIegalArgumentException 方法接收到非法参数
ClassCastException 对象强制类型转换出错
NumberFormatException 数字格式转换异常,如把”abc”转换成数字

// 小结:异常处理使用传统的方式,比较啰嗦,而且不推荐使用这种方式
// java给我们提供的有一套专门用于处理异常的技术
// 我们使用try catch来处理
// 使用trycatch处理异常分为三种情况
// 1.没有出现异常 正常执行

// 2.出现了异常 并且进行了捕获 执行catch块

// 3.出现了异常 但是没有捕获到 捕获的异常和出现的异常不匹配
// 我们可以使用多个catch块来处理多种异常 多个catch同时只能执行一个
// 多个catch块没有上限
// 假设现在有这样的代码 你不知道有可能会出现什么异常?
// 一、使用异常的父类Exception来处理所有的异常
// 二、但是不要这么去写 尽量还是精确到具体的异常
// 三、 catch块可以有多个 但是注意顺序 从小到大的顺序 范围从小到大

在try-catch块后加入finally块 finally块 表示不管是否出现异常 都会执行的代码
不执行的唯一情况
try > 有异常>catch 块 System.exit(1)

无异常 中断程序,退出Java虚拟机> finally 块

//finaly通常用于关闭一些资源 比如 数据库连接 io 操作
//try catch 和finally都不能单独出现
//try可以结合catch 出现 也可以跟finally结合出现
//finally 用于处理 不管什么情况下都执行的代码 比如我们出现了异常 但是却没有捕获
//finally块可以起到一个代码阅读的好处

多重catch 块
引发多种类型的异常
排列catch语句的顺序:先子类后父类
发生异常时按顺序逐个匹配
只执行第一个与异常类型匹配的catch语句

//1.能不能嵌套 可以的 但是不要嵌套try
//2.finally之后的代码会执行吗?
finally必须执行 如果报错 后续不执行了 否则就执行

//finally中不要对返回值做操作
//如果做了操作 依然按照try中的返回值
//在catch块中 也不推荐对返回值做操作
//但是报错的情况 如果在try返回值之前报错 那么就将遵照最终的返回值
//也就是 方法最后的return
//只有try中有return语句 会执行finally中的内容 但是 返回值还是try中的

小结
try-catch-finally结构中try语句块是必须的,catch,finally语句均可选,但两者至少出现之一
面试题 : try-catch块中存在return语句,是否还执行finally块?如果执行,说出执行顺序
//try catch finally中如果都存在return
//那么将使用最终 finally中的return作为返回值
//不要在finally和catch中加return 切记

try-catch-finally块中,finally块唯一不执行的情况是什么?
就是在finally之前 退出虚拟机
//System.exit(20) 这个方法状态码 0表示正常退出 非0表示非正常退出 1 表示某种情况 2表示某种情况
//目前来说 没有区别 都是退出
System.exit(20);
//非0表示非正常退出 1 表示某种情况 2表示某种情况
//System.out.println(10/0);

声明异常
如果在一个方法体中抛出了异常,如何通知调用者?
throws声明某个方法可能抛出的各种异常,多个异常逗号隔开
方式1:调用者使用try catch来处理这个异常
方式2:调用者不做处理 继续抛出,继续声明异常
main()方法声明的异常由Java虚拟机处理

//throws Exception表示声明当前方法有可能会出现一个 **异常 通知调用者去处理
//或者继续抛出
//所有异常和错误的父类 是Throwable
//有两个子类 一个是Error 一个是Exception
//Exception中有分为两派 一个是检查异常 一个是运行时异常
//检查异常在我们的代买编写阶段必须处理 否则编译不通过
//运行时异常不必

抛出异常 除了系统自动抛出异常外,有些问题需要程序员自行抛出异常
使用throw抛出异常
throw与throws
Throw Throws
生成并抛出异常 声明方法内抛出了异常
位于方法体内部,可作为单独语句使用 必须跟在方法参数列表后面,不能单独使用
抛出一个异常对象,且只能是一个 声明抛出异常类型,可以跟多个异常

自定义异常
当JDK中的异常类型不能满足程序的需要时,可以自定义异类
使用自定义异常的步骤
1.定义异常类2.编写构造方法,继承父类的实现3.实例化自定义异常对象4.使用throw抛出
继承Throwable类、继承Exception或者RuntimeException

异常处理原则
异常处理与性能
异常只能用于非正常情况
不用将过于庞大的代码块放在try中
‘ 在catch中指定具体的异常类型
需要对捕获的异常做处理

总结
异常分为 Checked 异常和运行时异常
Checked异常必须捕获或者声明抛出
运行时异常不要求必须捕获或者声明抛出
try-catch-finally中存在return语句的执行顺序
finally块中语句不执行的情况
throw和throws关键字的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值