提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
异常是程序在“编译”或者“执行”的过程中可能出现的问题。编译时异常是编译阶段就出错的,所以必须处理,否则代码根本无法通过,所以我们有必要认识和学习异常的处理机制。
一、异常的处理机制有哪些?
编译时异常的处理形式有三种:
- 出现异常直接抛出去给调用者,调用者也继续抛出去。
- 出现异常自己捕获处理。
- 前两者结合,出现异常直接抛出去给调用者,调用者捕获处理。
二、异常处理机制详细解释及代码
1.异常处理方式1—— throws
throws:用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理。
抛出异常格式:(第一种:如果方法异常过多,则代码过于繁琐)
方法 throws异常1,异常2,异常3 ..{}
规范格式:(一个Exception解决问题,简简单单,干干净净)
方法 throws Exception{}
代码如下(示例):
import java.text.SimpleDateFormat;
import java.util.Date;
public class exceptiontest {
public static void main(String[] args) throws Exception {
// TODO 自动生成的方法存根
String str="2022/03/25 21:10-19"; //标准格式:"yyyy-MM-dd HH:mm:ss"
datetest(str);
}
public static void datetest(String str) throws Exception {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date=sdf.parse(str);
System.out.println(date);
}
}t
结果:
Exception in thread "main" java.text.ParseException: Unparseable date: "2022/03/25 21:10-19"
at java.base/java.text.DateFormat.parse(DateFormat.java:396)
at csdn.exceptiontest.datetest(exceptiontest.java:16)
at csdn.exceptiontest.main(exceptiontest.java:12)
这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡。
2.异常处理方式2—— try...catch...
监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。
格式:
try{
//监视可能出现异常的代码
}catch (异常类型1 变量){
//处理异常
}catch (异常类型2 变量){
//处理异常
}...
建议格式:(直接Exception简单明了)
try{
//监视可能出现异常的代码
}catch (Exception 变量){
//处理异常
}
代码如下(示例):
import java.text.SimpleDateFormat;
import java.util.Date;
public class exceptiontest {
public static void main(String[] args) {
// TODO 自动生成的方法存根
String str="2022/03/25 21:10-19"; //标准格式:"yyyy-MM-dd HH:mm:ss"
datetest(str);
}
public static void datetest(String str){
try {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(str);
System.out.println(date);
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace(); //java自带的报错方法,将异常栈中的异常打印出来
}
}
}
结果:
java.text.ParseException: Unparseable date: "2022/03/25 21:10-19"
at java.base/java.text.DateFormat.parse(DateFormat.java:396)
at csdn.exceptiontest.datetest(exceptiontest.java:17)
at csdn.exceptiontest.main(exceptiontest.java:11)
这种方式还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行。但是方法自己处理了异常,调用者不知道方法是否异常。
3.异常处理方式3——前两者结合
方法直接将异通过throws抛出去给调用者;调用者收到异常后直接捕获处理。
代码如下(示例):
import java.text.SimpleDateFormat;
import java.util.Date;
public class exceptiontest {
public static void main(String[] args) {
// TODO 自动生成的方法存根
String str="2022/03/25 21:10-19"; //标准格式:"yyyy-MM-dd HH:mm:ss"
try {
datetest(str);
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
public static void datetest(String str) throws Exception{
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(str);
System.out.println(date);
}
}
结果:
java.text.ParseException: Unparseable date: "2022/03/25 21:10-19"
at java.base/java.text.DateFormat.parse(DateFormat.java:396)
at csdn.exceptiontest.datetest(exceptiontest.java:20)
at csdn.exceptiontest.main(exceptiontest.java:12)
这种方式,完美避免了前两者的缺点,结合了前两种的优点(调用者知道了方法是否异常,也不会是虚拟机死亡)
三.运行时异常
运行时异常指:编译时不出错,运行时异常。方法会自动抛出异常,在外层try{}catch{}即可。
代码如下(示例):
public class exceptiontest {
public static void main(String[] args) {
// TODO 自动生成的方法存根
try {
test(10);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public static void test(int x){
System.out.println(x/0);
}
}
结果:
java.lang.ArithmeticException: / by zero
at csdn.exceptiontest.test(exceptiontest.java:16)
at csdn.exceptiontest.main(exceptiontest.java:8)
总结
在开发中按照规范来说第三种方式是最好的:底层的异常抛出去给最外层,最外层集中捕获处理。