栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

异常的处理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

异常的处理

异常

前言一、防御式编程二、异常的基本用法

(一).捕获异常

1、 语法:2、示例3、 异常类型需匹配4、finally (二)异常处理流程 二、抛出异常:throw三、java异常体系

1、异常类派生2、受查异常(1)try catch 包裹起来(2)方法上加上异常说明 五、总结

前言

什么是异常
所谓异常指的就是程序在 运行时 出现错误时通知调用者的一种机制.
运行时:指的是程序已经编译通过得到 class 文件了, 再由 JVM 执行过程中出现的错误.

除以0

System.out.println(10 / 0);
//执行结果
Exception in thread "main" java.lang.ArithmeticException:/by zreo

数组下标越界

int[] arr = {1, 2, 3};
System.out.println(arr[100]);
// 执行结果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100

null对象

public class Test {
    public int num = 10;
    public static void main(String[] args) {
        Test t = null;
        System.out.println(t.num);
   }
}
// 执行结果
Exception in thread "main" java.lang.NullPointerException
一、防御式编程

LBYL: Look Before You Leap. 在操作之前就做充分的检查.
EAFP: It’s Easier to Ask Forgiveness than Permission. “事后获取原谅比事前获取许可更容易”. 也就是先操作, 遇到问题再处理.

二、异常的基本用法 (一).捕获异常 1、 语法:
try{ 
 有可能出现异常的语句 ; 
}[catch (异常类型 异常对象) {
} ... ]
[finally {
 异常的出口
}]

try 代码块中放的是可能出现异常的代码.catch 代码块中放的是出现异常后的处理行为.finally 代码块中的代码用于处理善后工作, 会在最后执行.其中 catch 和 finally 都可以根据情况选择加或者不加. 2、示例

int[] arr = {1, 2, 3};
try {
    System.out.println("before");
    System.out.println(arr[100]);
    System.out.println("after");
} catch (ArrayIndexOutOfBoundsException e) {
    // 打印出现异常的调用栈
    e.printStackTrace();
}
System.out.println("after try catch");
// 执行结果
before
java.lang.ArrayIndexOutOfBoundsException: 100
 at demo02.Test.main(Test.java:10)
after try catch

一旦 try 中出现异常, 那么 try 代码块中的程序就不会继续执行, 而是交给 catch 中的代码来执行. catch 执行完毕会继续往下执行. 3、 异常类型需匹配

int[] arr = {1, 2, 3};
try {
    System.out.println("before");
    arr = null;
    System.out.println(arr[100]);
    System.out.println("after");
} catch (ArrayIndexOutOfBoundsException e) {
    e.printStackTrace();
}
System.out.println("after try catch");
// 执行结果
before
Exception in thread "main" java.lang.NullPointerException
 at demo02.Test.main(Test.java:11)

此时, catch 语句不能捕获到刚才的空指针异常. 因为异常类型不匹配.catch 只能处理对应种类的异常段代码可能会抛出多种不同的异常, 不同的异常有不同的处理方式. 因此可以搭配多catch代码块。 4、finally

表示最后的善后工作, 例如释放资源无论是否存在异常, finally 中的代码一定都会执行到

int[] arr = {1, 2, 3};
try {
    System.out.println("before");
    arr = null;
    System.out.println(arr[100]);
    System.out.println("after");
} catch (Exception e) {
    e.printStackTrace();
} finally {
    System.out.println("finally code");
}
// 执行结果
before
java.lang.NullPointerException
 at demo02.Test.main(Test.java:12)
finally code

finally 执行的时机是在方法返回之前(try 或者 catch 中如果有 return 会在这个 return 之前执行 finally). 但是如果
finally 中也存在 return 语句, 那么就会执行 finally 中的 return, 从而不会执行到 try 中原有的 return.

public static void main(String[] args) { 
 System.out.println(func()); 
} 
public static int func() { 
 try { 
 return 10; 
 } finally { 
 return 20; 
 } 
} 
// 执行结果
20
(二)异常处理流程

程序先执行 try 中的代码如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配如果找到匹配的异常类型, 就会执行 catch 中的代码如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行)如果上层调用者也没有处理的了异常, 就继续向上传递一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止. 二、抛出异常:throw

程序猿也可以手动抛出某个异常. 使用 throw 关键字完成这个操作.

 System.out.println(divide(10, 0)); 
} 
public static int divide(int x, int y)throws ArithmeticException { 
 if (y == 0) { 
 throw new ArithmeticException("抛出除 0 异常"); 
 } 
 return x / y; 
} 
// 执行结果
Exception in thread "main" java.lang.ArithmeticException: 抛出除 0 异常
 at demo02.Test.divide(Test.java:14) 
 at demo02.Test.main(Test.java:9)
三、java异常体系 1、异常类派生

顶层类 Throwable 派生出两个重要的子类, Error 和 Exception其中 Error 指的是 Java 运行时内部错误和资源耗尽错误. 应用程序不抛出此类异常.Exception 是我们程序猿所使用的异常类的父类.其中 Exception 有一个子类称为 RuntimeException , 这里面又派生出很多我们常见的异常类 2、受查异常

Java语言规范将派生于 Error 类或 RuntimeException 类的所有异常称为 非受查异常, 所有的其他异常称为受查异常.如果一段代码可能抛出受查异常, 那么必须显式进行处理.
例如 (1)try catch 包裹起来

public static void main(String[] args) { 
 System.out.println(readFile()); 
} 
public static String readFile() { 
 File file = new File("d:/test.txt"); 
 Scanner sc = null; 
 try { 
 sc = new Scanner(file); 
 } catch (FileNotFoundException e) { 
 e.printStackTrace(); 
 } 
 return sc.nextLine(); 
}
(2)方法上加上异常说明
public static void main(String[] args) { 
 try { 
 System.out.println(readFile()); 
 } catch (FileNotFoundException e) { 
 e.printStackTrace(); 
 } 
} 
public static String readFile() throws FileNotFoundException { 
 File file = new File("d:/test.txt"); 
 Scanner sc = new Scanner(file); 
 return sc.nextLine(); 
}
五、总结

**“异常”**不是程序的编写错误,也不是编译时错误,而是一种可规避的运行时错误,在许多的实际情况下,并不是一般一眼的,有时会有特殊存在,在各种有必要存在的错误之中,就可以采用抛异常的处理方法。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/749668.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号