Java十分钟精通异常处理机制
作者:星空下的213 时间:2022-08-04 19:03:07
一、什么是异常
异常机制:
异常机制是指当程序出现错误后,程序如何处理。具体来说就是程序发生异常,异常机制提供程序的退出安全通道。
通俗来说:就是为了让程序继续执行下去,不至于中断。
程序错误:
程序错误分为三种:
1.编译错误
2.运行时错误
3.逻辑错误。
(1)编译错误:因为程序没有遵循语法规则,编译程序能够自己发现并提示我们的错误的原因和位置。
(2)运行时错误:因为程序在执行时,运行环境发现了不能执行的操作。
(3)逻辑错误:因为程序没有按照预期的逻辑顺序执行。
异常就是指程序运行时发生错误,而异常处理就是对这些错误进行处理和控制。
编译错误如下:
运行错误如下:
算数异常报错:
二、异常的结构图
常见异常:
序号 | 异常名称 | 异常描述 |
---|---|---|
1 | java.lang.NullPointerException | 空指针异常:对象为空,并且调用相应方法。 |
2 | java.lang.ClassNotFoundException | 找不到指定类 |
3 | java.lang.ArrayIndexOutOfBoundsException | 数组下标越界 |
4 | java.lang.NumberFormatException | 数字格式化异常 |
5 | java.lang.ArithmeticException | 数学运算异常 |
6 | java.lang.StackOverflowError | 内存空间溢出错误,方法递归调用中,经常发生 |
7 | java.lang.ClassCastException | 类型转换异常,向下转型中经常发生 |
8 | java.text.ParseException | 时间格式化异常,SimpleDateFormart中经常发生 |
9 | java.util.InputMismatchException | 输入类型不匹配异常 |
三、捕获异常
虚拟机对异常的两种处理方式:
捕获异常
抛出异常
捕获异常
try - catch - finally
try:尝试着执行可能会出现异常的代码
catch:如果try中的代码在执行过程中,出现了异常,捕获该异常,如果没有异常,就不执行。
finaliy:其中的代码块是不管报不报错都会执行的,通常用来释放资源。
try{
//可能会出错的代码块
}catch(){
//出现异常后,执行的语句
}finally{
//通常用来释放资源
}
四、声明和抛出异常
1.使用throws声明异常
运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常
public void fun1() throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse("2020-10-12");
}
2.使用throw抛出异常
throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。
public void fun2() {
throw new NullPointerException("空指针异常");
System.out.println("hello world");//会报红,提示unreachable statement,该语句不可能被执行
}
案例:
1、嵌套try-catch
@Test
public void fun2() {
try {
throw new Exception("非运行时异常,哈哈哈");
} catch (Exception e) {
e.printStackTrace();
try {
throw new ParseException("解析异常,哈哈哈",0);
} catch (Exception ex) {
ex.printStackTrace();
}
}finally {
try {
throw new TimeoutException("超时异常,哈哈哈");
} catch (TimeoutException e) {
e.printStackTrace();
try {
throw new SQLException("SQL异常");
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
}
2、代替返回语句
public int funR1(){
try {
return 1;
}catch (Exception e){
throw new RuntimeException();
}
}
public int funR2(){
if(true) {
return 1;
}else{
throw new RuntimeException();
}
}
五、自定义异常
自定义异常,通常就是定义了一个继承自Exception类的子类,那么这个类就是一个自定义异常类。通常情况下,我们都会直接继承自Exception,一般不会继承某个运行时异常类。
案例如下:
public class HeroNotExistException extends RuntimeException {
private String m;
public String getM() {
return m;
}
public void setM(String m) {
this.m = m;
}
//两个参数的有参构造,一个传递给父类Throwable,一个自己用
public HeroNotExistException(String message, String m){
super(message);
this.m=m;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入您最欣赏的历史人物:");
String name = sc.next();
if(name.equals("孙悟空")){
try{
throw new HeroNotExistException("英雄人物不存在","哈哈");
}catch (HeroNotExistException e){
e.printStackTrace();
System.out.println(e.getM());
}
}
}
}
来源:https://blog.csdn.net/xing_yu_xianko/article/details/112485706
标签:Java,异常,处理,机制
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
springboot整合token的实现代码
2023-11-10 19:02:03
不可不知道的10个java谎言
2022-01-21 10:25:40
Android实现关机后数据不会丢失问题
2021-06-08 18:54:47
![](https://img.aspxhome.com/file/2023/1/104661_0s.jpg)
解决Spring Batch框架job任务只跑一次的问题
2023-01-07 00:13:53
Android 仿微信发动态九宫格拖拽、删除功能
2022-08-28 12:51:03
![](https://img.aspxhome.com/file/2023/9/93279_0s.jpg)
自定义注解和springAOP捕获Service层异常,并处理自定义异常操作
2023-04-04 05:26:04
![](https://img.aspxhome.com/file/2023/9/93149_0s.png)
MyBatis Mapper接受参数的四种方式代码解析
2021-09-05 19:28:27
Java生成含字母和数字的6位随机字符串
2023-04-02 02:28:58
Android RecyclerView 实现快速滚动的示例代码
2023-02-17 05:32:50
![](https://img.aspxhome.com/file/2023/2/138022_0s.gif)
在Winform和WPF中注册全局快捷键实现思路及代码
2023-03-13 23:00:25
如何使用java修改文件所有者及其权限
2023-11-16 09:35:53
![](https://img.aspxhome.com/file/2023/9/76309_0s.png)
教你怎么用Java开发扫雷游戏
2023-07-22 09:49:26
![](https://img.aspxhome.com/file/2023/0/63480_0s.png)
浅谈java面向对象中四种权限
2023-03-09 18:43:46
Swing拆分窗格控件JSplitPane使用详解
2022-11-14 21:13:48
![](https://img.aspxhome.com/file/2023/0/63500_0s.jpg)
Java 十大排序算法之计数排序刨析
2023-11-28 19:21:26
![](https://img.aspxhome.com/file/2023/3/68133_0s.png)
SpringBoot使用validation做参数校验说明
2022-04-24 09:18:03
Java手写线程池的实现方法
2023-10-30 12:50:03
![](https://img.aspxhome.com/file/2023/1/58701_0s.jpg)
C#中Lambda表达式的用法
2022-12-22 15:59:17
Android数字华容道小游戏开发
2023-10-06 22:31:35
![](https://img.aspxhome.com/file/2023/1/92611_0s.png)
C#实现根据数字序号输出星期几的简单实例
2022-01-23 22:13:56