异常

1.认识异常

异常:程序在运行时出现错误时通知调用者的一种机制.

异常的核心思想就是 EAFP: It’s Easier to Ask Forgiveness than Permission,即先操作, 遇到问题再处理。还有一种为LBYL: Look Before You Leap. 在操作之前就做充分的检查

异常的继承体系
异常的基类: Throwable
严重问题: Error: 不予处理,因为这种问题一般是很严重的问题,比如: 内存溢出
非严重问题: Exception:
编译时异常: 非RuntimeException
运行时异常: RuntimeException

2. 异常的基本用法

基本语法

try{    
    有可能出现异常的语句 ; 
}[catch (异常类型 异常对象) {
} ... ] 
[finally {
    异常的出口 
}]
  • try 代码块中放的是可能出现异常的代码.
  • catch 代码块中放的是出现异常后的处理行为.
  • finally 代码块中的代码用于处理善后工作, 会在最后执行.
  • 其中 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则一定抛出了某种异常

3.自定义异常

从银行取钱,发现钱不够,通过自定义异常给出提示。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值