❤写在前面
❤博客主页:努力的小鳴人
❤系列专栏:JavaSE超详总结😋
❤欢迎小伙伴们,点赞👍关注🔎收藏🍔一起学习!
❤如有错误的地方,还请小伙伴们指正!🌹
🔥系列传送门:
【附章2Java面向对象编程】盘点关键字详解 this、super、final
【04章Java面向对象编程(下)】面向对象编程的必杀技
【04章Java面向对象编程(中)】解密 继承性和多态性
【04章Java面向对象编程(上)】万事万物皆对象的初体验【全站热榜第二】
【附章1Java数组中常见算法】图文并茂详解十大排序算法让您回味无穷
【03章Java数组】程序员必看数组详解
【02章Java基本语法】详细讲解让你重新认识Java基本语法和流程流程控制
【01章Java语言概述】Java学了很久了吧,快回来熟悉熟悉吧(详细)
一、异常的概述
在代码的运行过程中很多问题不是靠代码就能够避免的
Java把异常当做对象来处理,并定义了一个基类 java.lang.Throwable 作为所有异常的超类
👌异常
程序员通常只能处理Exception,而对Error无能为力
- 定义:在Java语言中,将程序执行中发生的不正常情况称为“异常”
- 分类:
●Error:Java虚拟机无法解决的严重问题,如:JVM系统内部错误、资源耗尽等严重情况。
●Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使
用针对性的代码进行处理,例空指针访问、数组角标越界 - Java把异常当做对象来处理,并定义了一个基类 java.lang.Throwable 作为所有异常的超类
👌运行时异常
- 指编译器不要求强制处置的异常。一般指编程时的逻辑错误,是程序员应该积极避免其出现的异常
- java.lang.RuntimeException 类及它的子类都是运行时异常
👌编译时异常
- 指编译器要求必须处置的异常,程序在运行时由于外界因素造成的一般性异常
编译器要求Java程序必须捕获或声明所有编译时异常
二、常见异常
- java.lang.RuntimeException
●ClassCastException:类转换异常
●ArrayIndexOutOfBoundsException:数组索引超出范围异常
●NullPointerException:空指针异常
●ArithmeticException:算术异常
●NumberFormatException:数字格式异常
●InputMismatchException:输入不匹配异常 - java.io.IOExeption
●FileNotFoundException:文件未找到异常
●EOFException:文件结束异常 - java.lang.ClassNotFoundException
:类未找到异常 - java.lang.InterruptedException
:中断异常 - java.io.FileNotFoundException
:文件未找到异常 - java.sql.SQLException
:SQL异常
三、try-catch-finally
异常处理机制一
Java提供的是异常处理的抓抛模型
try
:捕获异常的第一步是用try{…}语句块选定捕获异常的范围,将可能出现异常的代码放在try语句块中catch
(Exceptiontype e):在catch语句块中是对异常对象进行处理的代码,每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象finally
:捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理- 不论在try代码块中是否发生了异常事件,catch语句是否执行,catch语句是否有异常,catch语句中是否有return,finally块中的语句都会被执行
finally语句和catch语句是任选的
代码如下:
public class DivideZero {
int x;
public static void main(String[] args) {
int y;
DivideZero c = new DivideZero();
try {
y = 3 / c.x;
} catch (ArithmeticException e) {
System.out.println("divide by zero error!");
}
System.out.println("program ends ok!");
}
}
运行结果:
java DivideZero
divide by zero error!
program ends ok!
四、throws
异常处理机制二
- 声明抛出异常是Java中处理异常的第二种方式
●如果一个方法中的语句执行时可能生成某种异常,但是不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理
●在方法声明中用 throws 语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
声明抛出异常举例:
import java.io.*;
public class ThrowsTest {
public static void main(String[] args) {
ThrowsTest t = new ThrowsTest();
try {
t.readFile();
} catch (IOException e) {
e.printStackTrace();
}
}
public void readFile() throws IOException {
FileInputStream in = new FileInputStream("atguigushk.txt");
int b;
b = in.read();
while (b != -1) {
System.out.print((char) b);
b = in.read();
}
in.close();
}
}
👌重写方法声明抛出异常的原则
重写方法不能抛出比被重写方法范围更大的异常类型
在多态的情况下举例:
public class A {
public void methodA() throws IOException {
……
}
}
public class B1 extends A {
public void methodA() throws FileNotFoundException {
……
}
}
public class B2 extends A {
public void methodA() throws Exception { //报错
……
}
}
五、throw
手动抛出异常
Java异常类对象也可根据需要使用人工创建并抛出
- 首先要生成异常类对象,然后通过throw语句实现抛出操作提交给Java运行环境
IOException e = new IOException();
throw e; - 可以抛出的异常必须是Throwable或其子类的实例
下面的语句在编译时将会产生语法错误:throw new String(“want to throw”);
六、自定义异常类
一般地,用户自定义异常类都是 RuntimeException 的子类
- 自定义异常类需要:
●编写几个重载的构造器
●提供serialVersionUID
●通过throw抛出 - 自定义异常最重要的是异常类的名字,当异常出现时,可以根据名字判断异常类型
用户自己的异常类必须继承现有的异常类
举例:
public class ReturnExceptionDemo {
static void methodA() {
try {
System.out.println("进入方法A");
throw new RuntimeException("制造异常");
}finally {
System.out.println("用A方法的finally");
}
}
static void methodB() {
try {
System.out.println("进入方法B");
return;
} finally {
System.out.println("调用B方法的finally");
}
}
public static void main(String[] args) {
try {
methodA();
} catch (Exception e) {
System.out.println(e.getMessage());
}
methodB();
}
}
运行结果:
进入方法A
用A方法的finally
制造异常
进入方法B
调用B方法的finally
🎁总结:Java异常处理可以让程序具有更好的容错性,是程序更加健壮,也提供了处理程序运行时出现的任何意外或异常情况的方法
👌 作者算是一名Java初学者,文章如有错误,欢迎评论私信指正,一起学习~~
😊如果文章对小伙伴们来说有用的话,点赞👍关注🔎收藏🍔就是我的最大动力!
🚩不积跬步,无以至千里,书接下回,欢迎再见🌹