赞
踩
异常:程序在运行时出现错误时通知调用者的一种机制.
异常的核心思想就是 EAFP: It’s Easier to Ask Forgiveness than Permission,即先操作, 遇到问题再处理。还有一种为LBYL: Look Before You Leap. 在操作之前就做充分的检查
异常的继承体系
异常的基类: Throwable
严重问题: Error: 不予处理,因为这种问题一般是很严重的问题,比如: 内存溢出
非严重问题: Exception:
编译时异常: 非RuntimeException
运行时异常: RuntimeException
基本语法
try{
有可能出现异常的语句 ;
}[catch (异常类型 异常对象) {
} ... ]
[finally {
异常的出口
}]
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 执行完毕会继续往下执行.
catch 可以有多个
int[] arr = {1, 2, 3}; try { System.out.println("before"); arr = null; System.out.println(arr[100]); System.out.println("after"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("这是个数组下标越界异常"); e.printStackTrace(); } catch (NullPointerException e) { System.out.println("这是个空指针异常"); e.printStackTrace(); } System.out.println("after try catch"); // 执行结果 before 这是个空指针异常 java.lang.NullPointerException at demo02.Test.main(Test.java:12) after try catch
一段代码可能会抛出多种不同的异常, 不同的异常有不同的处理方式. 因此可以搭配多个 catch 代码块
异常处理流程
程序先执行 try 中的代码
如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配
如果找到匹配的异常类型, 就会执行 catch 中的代码
如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者.
无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).
如果上层调用者也没有处理的了异常, 就继续向上传递.
一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止
抛出异常
除了 Java 内置的类会抛出一些异常之外, 程序员也可以手动抛出某个异常. 使用 throw 关键字完成这个操作.
public static void main(String[] args) {
System.out.println(divide(10, 0)); }
public static int divide(int x, int y) {
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)
异常说明
我们在处理异常的时候, 通常希望知道这段代码中究竟会出现哪些可能的异常. 我们可以使用 throws 关键字, 把可能抛出的异常显式的标注在方法定义的位置. 从而提醒调用者要注意捕获这些异常.
public static int divide(int x, int y) throws ArithmeticException {
if (y == 0) {
throw new ArithmeticException("抛出除 0 异常");
}
return x / y;
}
throws和throw处理异常
throws:使用throws关键字在方法上将异常抛给调用者,谁调用谁处理。
throw:在功能方法内部出现某种异常,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
区别:
throws
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常
throw
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
这个异常对象可以是编译期异常对象,可以是运行期异常对象
表示抛出异常,由方法体内的语句处理
throw则是抛出了异常,执行throw则一定抛出了某种异常
从银行取钱,发现钱不够,通过自定义异常给出提示。
import java.util.Scanner; public class Blog { public static void main(String[] args) { int money=1000; try {//捕捉异常 withdrawal(money); } catch (NoMoneyRuntimeException e) { e.printStackTrace(); System. } } private static void withdrawal(int money){ Scanner scanner = new Scanner(System.in); System.out.println("请输入取款金额:"); int quMoney = scanner.nextInt(); if(quMoney<= money){ System.out.println("取款成功!"); }else { throw new NoMoneyRuntimeException("余额不足!");//抛出异常 } } }
自定义异常类继承RuntimeException
class NoMoneyRuntimeException extends RuntimeException{
public NoMoneyRuntimeException(String s) {
super(s);
}
}
运行结果:
请输入取款金额:
1200
异常.NoMoneyRuntimeException: 余额不足!
at 异常.Blog.withdrawal(Blog.java:23)
at 异常.Blog.main(Blog.java:10)
Process finished with exit code 0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。