这是我参与 8 月更文挑战的第 25 天,活动详情查看:8 月更文挑战
前言
本文主要讲解 Java 异常相关知识点,主要从以下三个方面着手:
- 何为异常
- 如何处理异常
- 如何自定义异常以及如何处理
什么是异常
- 定义 : 导致程序正常流程被中断的事件,叫做 异常;
- 常见异常
其中 Throwable 是 Error 和 Exception 的父类; RuntimeException 不是必须进行 try catch 处理的异常;但 CheckedException 则是 必须进行处理的异常,要么 throws,要么 try catch;Error 指 系统级别的异常 ;
graph LR
A[Throwable] --- B[Exception]
A[Throwable] --- C[Error]
B[Exception] --- D[RuntimeException]
B[Exception] --- E[CheckedException]
E[CheckedException] --- F[IOException]
E[CheckedException] --- G[SQLException]
E[CheckedException] --- H[自定义 Exception]
D[RuntimeException] --- I[ArithmeticException]
D[RuntimeException] --- NullPointException
D[RuntimeException] --- ClassCaseException
D[RuntimeException] --- ArrayIndexOutOfBoundsException
D[RuntimeException] --- NumberFormatException
处理异常
对于异常的处理,我们通常有两种方式,第一种是通过 try …… catch 的方式,第二种则是通过 thorws 的方式,接下来我们就分别看看两种方式是如何处理异常的。
try catch
我们首先来看第一种通过 try……catch 的方式,它将可能抛出异常的代码部分放在 try 代码块中,若抛出异常,则立即跳出 tyr 代码块,转到对应 catch 块中;若没有抛出异常,则执行完 try 代码块部分后,不再执行对应 catch 块代码,而是直接顺序往下执行;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class TestException {
public static void main(String[] args) {
File f= new File("/home/cunyu/lol.sh");
try{
System.out.println("试图打开 /home/cunyu/lol.sh");
new FileInputStream(f);
System.out.println("成功打开");
}
catch(FileNotFoundException e){
System.out.println("/home/cunyu/lol.sh 不存在");
e.printStackTrace();
}
}
}
finally
常常与 try ... catch 同时使用,且无论 try 中是否出现异常,finally 代码块都会被执行;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class TestException {
public static void main(String[] args) {
File f= new File("/home/cunyu/lol.sh");
try{
System.out.println("试图打开 /home/cunyu/lol.sh");
new FileInputStream(f);
System.out.println("成功打开");
}
catch(FileNotFoundException e){
System.out.println("/home/cunyu/lol.sh 不存在");
e.printStackTrace();
}
finally{
System.out.println("总会执行的代码");
}
}
}
throws
接着我们再来看第二种通过 throws 的方式,它主要用于当方法之间嵌套调用时,当内层方法不想对异常进行处理时,可以利用 throws 将异常抛出到上一层方法中,由上一层的方法处理;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class TestException {
public static void main(String[] args) {
method1();
}
private static void method1() {
try {
method2();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void method2() throws FileNotFoundException {
File f = new File("/home/cunyu/lol.sh");
System.out.println("试图打开 /home/cunyu/lol.sh");
new FileInputStream(f);
System.out.println("成功打开");
}
}
throw和throws的区别 :throws出现在方法声明上,throw通常出现在方法体内;throws表示可能出现异常,而throw则是抛出了异常,执行throw则一定抛出了某个异常对象;
自定义异常
创建自定义异常
要自定义异常,可以自定义一个异常类继承自 Exception,然后提供两个构造方法:
- 无参构造方法;
- 带参构造方法,同时调用父类对应构造方法;
public class MyException extends Exception{
public MyException(){
}
public MyException(String msg){
super(msg);
}
}
抛出自定义异常
当创建自定义异常后,就可以创建一个自定义异常实例,然后利用 throw 在方法体内将其抛出,同时通过 throws 在方法上将该异常抛出;
public class Hero{
public String name;
protected float hp;
class MyException extends Exception{
public MyException(){
}
public MyException(String msg){
super(msg);
}
}
// throw 在方法体内抛出异常,throws 在方法上抛出异常
public void attackHero(Hero h) throws MyException{
if(h.hp == 0){
throw new MyException("亚索已死");
}
}
}
总结
以上就是今天的所有内容了,主要介绍了异常简介、常见的处理异常的两种方式以及如何自定义异常并处理它。原创不易,如果你觉得我写的内容对你有所帮助,那就帮忙点赞关注吧!