六、异常的捕获及处理
6.1 认识异常
异常程寻中导致程寻中断的一种指令流。
6.2 处理异常
Java针对异常的处理提供了3个核心的关键字:try 、catch、finally,利用这3个关键字就可以组成以下异常处理格式。
try{
//有可能出现异常的语句
}[catch(异常类型 对象)]{
//异常处理;
}[catch(异常类型 对象)]{
//异常处理;
}[finally{
//不管是否出现异常,都执行统一的代码;
}]
应用异常处理格式
public class TestDemo {
public static void main(String[] args) {
// write your code here
System.out.println("1.除法计算开始。");
try{
System.out.println("2.除法计算:"+(10/0));
//异常产生之后的语句将不再执行,此处在try中产生异常,所以下面的输出不会执行
System.out.println("朱小东好帅");
}catch (ArithmeticException e){
e.printStackTrace();
}finally {
System.out.println("###不管异常我都执行###");
}
System.out.println("3.除法计算结束。");
}
}
异常处理完整考虑
package com.company;
public class TestDemo {
public static void main(String[] args) {
// write your code here
System.out.println("1.除法计算开始。");
try{
int x = Integer.parseInt(args[0]);
int y=Integer.parseInt(args [1]);
System.out.println("2.除法计算:"+(y/x));
//异常产生之后的语句将不再执行,此处在try中产生异常,所以下面的输出不会执行
System.out.println("朱小东好帅");
}catch (ArithmeticException e){ //处理算数异常
e.printStackTrace();
}catch (NumberFormatException e){ //处理参数不足转换异常
e.printStackTrace();
}catch (ArrayIndexOutOfBoundsException e){ //处理数字转换异常
e.printStackTrace();
}finally {
System.out.println("###不管异常我都执行###");
}
System.out.println("3.除法计算结束。");
}
}
6.3 异常的处理流程
所有的异常类型最高继承类是Throwable ,并且在Throwable下有两个子类。
- Error;指的是JVM错误,这时程寻并没有执行,无法处理;、
- Exception:指的是程寻运行中产生的异常,用户可以使用异常处理格式处理。
- Exception要写在ArithmeticException 之后,因为ArithmeticException是Exception的子类。
- 在要求严格的项目里,异常一定要分开处理。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SmHvQWXe-1655555852380)(D:\学习文件夹\Java\第一行代码Java\绘图1.png)]
6.4 throws关键字
throws关键字主要在方法定义上使用,表示此方法中不进行异常的处理,而是交给被调用处理。
class MyMath {
public static int div(int x,int y)throws Exception{
return x/y;
}
}
public class TestDemo {
public static void main(String[] args) {
try {
System.out.println(MyMath.div(10,2));
}catch (Exception e){
e.printStackTrace();
}
}
}
6.5 throw关键字
自己手动化抛出一个实例化对象
try {
throw new Exception("自己定义的异常!");
}catch (Exception e){
e.printStackTrace();
}
6.6 异常处理的标准格式
package com.company;
class MyMath {
public static int div(int x,int y)throws Exception{
System.out.println("除法计算开始。");
int result=0;
try {
result=x/y;
}catch (Exception e){
throw e;
}finally {
System.out.println("计算结束。");
}
return result;
}
}
public class TestDemo {
public static void main(String[] args) {
// write your code here
try {
System.out.println(MyMath.div(10,0));
}catch (Exception e){
e.printStackTrace();
}
}
}
6.7 RuntimeException类
程序在编译时不会强制性地要求用户处理异常,用户可以根据自己的需要有选择性的进行处理,但是如果没有处理又发生了异常,将交给JVM默认处理。
RuntimeException与Exception的区别
-
RuntimeException是Exception的子类;
-
Exception定义了必须处理的异常,而RuntimeException定义的异常可以选择性地进行处理。
-
常见的RuntimeException有:
NumberFormatException
ClassCastException
NullPointerException
ArithmeticException
ArrayIndexOutOfBoundsException
6.8 assert关键字
主要功能是进行断言。断言指的是程序执行到某行之后,其结果一定是预期的结果。
不会影响程序的执行。
public class TestDemo {
public static void main(String[] args) {
// write your code here
int num=10;
assert num==20; //进行断言操作
System.out.println("num="+num);
}
}
6.9 自定义异常
如果想要自定义异常类,只需要继承Exception(强制)或RuntimeException(选择)父类即可
int num=10;
assert num==20; //进行断言操作
System.out.println("num="+num);
}
}
### 6.9 自定义异常
如果想要自定义异常类,只需要继承Exception(强制)或RuntimeException(选择)父类即可
**class 自定义异常类 extends Exception**