异常处理

异常处理

异常:在程序中导致程序中断的指令流

1. 认识异常

package com.gkd.exception;
​
public class ExceptionDemo1 {
​
    public static void main(String[] args) {
        int i = 10;
        int j = 0;
        System.out.println("---------------计算开始-----------------");
        int result = i / j;
        System.out.println("---------------计算结束-----------------");
        System.out.println(result);
    }
​
}

 

 

Java异常体系结构图:

 

 

throwable:是所有异常的父类(根类)

throwable分两类:

  • Error:错误,JVM内部产生的错误,程序代码无法控制处理.

  • Exception:异常,一般由代码中的逻辑错误,语法错误所导致的程序中断.程序员应该尽量避免和处理异常.

Exception:

  • 受检异常:编译期异常,Exception的直接或间接子类

  • 非受检异常:运行时异常,RuntimeException的直接或间接子类

2 处理异常

异常处理的标准格式:

try{ 
    // 有可能发生异常的代码段 
}catch(异常类型 对象){ 
    // 异常的处理操作 
}catch(异常类型 对象){ 
    // 异常的处理操作 
} ... 
finally{
    // 异常的统一出口 
}

处理上面代码产生的异常

private static void arithmeticException() {
        int i = 10;
        int j = 0;
        System.out.println("---------------计算开始-----------------");
        //快捷键:Alt+shirt+z
        int result = 0;
        try {
            result = i / j;
        } catch (ArithmeticException e) {
            System.out.println("除数不能为0");
            e.printStackTrace();
        }
        
        System.out.println("---------------计算结束-----------------");
        System.out.println(result);
}

 

如果一段代码有多个异常产生呢?接下来看下面的实例代码:

private static void gerResult() {
    Scanner input = new Scanner(System.in);
    System.out.println("请输入第一个数:");
    int i = input.nextInt();
    System.out.println("请输入第二个数:");
    int j = input.nextInt();
    int result = i / j ;
    System.out.println("result = " + result);

上面的代码要求用户输入两个数,如果输入的第二个数为0还会抛出ArithmeticException,如果输入的不是数字,则会抛出 InputMismatchException ,这个时候我们就要同时处理多个异常.

private static void gerResult() {
        try {
            Scanner input = new Scanner(System.in);
            System.out.println("请输入第一个数:");
            int i = input.nextInt();
            System.out.println("请输入第二个数:");
            int j = input.nextInt();
            int result = i / j ;
            System.out.println("result = " + result);
        } catch (ArithmeticException e) {
            System.out.println("有算数异常产生");
            //e.printStackTrace();
        } catch (InputMismatchException e) {
            System.out.println("请输入数字");
        }
}

3. 异常的统一出口

finally语句块:不管是否有异常产生,都会执行的代码段.

根据finally语句块的特点,我们可以在finally语句块中做一些资源回收,释放的操作.

private static void gerResult() {
        try {
            Scanner input = new Scanner(System.in);
            System.out.println("请输入第一个数:");
            int i = input.nextInt();
            System.out.println("请输入第二个数:");
            int j = input.nextInt();
            int result = i / j ;
            System.out.println("result = " + result);
        } catch (ArithmeticException e) {
            System.out.println("有算数异常产生");
            //e.printStackTrace();
        } catch (InputMismatchException e) {
            System.out.println("请输入数字");
        } finally{
            System.out.println("异常的统一出口");
        }
}

 

 

4. throws 关键字

throws用在方法声明的时候向上抛出异常,表示方法内部不处理异常,交给调用方去处理.

 

 

 

 

5. 自定义异常

package com.gkd.exception;
​
public class MyException extends Exception {
    
    public MyException(String errorMessage){
        super(errorMessage);
    }
​
//  @Override
//  public String toString() {
//      return "你是小猩猩吗";
//  }
    
}

使用我们的自定义异常

package com.gkd.exception;
​
public class UseMyException {
    
    public boolean login(String name,String password) throws MyException {
        if("admin".equals(name) && "123456".equals(password)){
            return true;
        }
        throw new MyException("用户名或密码错误!");
    }
}

测试代码:

package com.gkd.exception;

import java.util.Scanner;

public class Test {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("请输入用户账号:");
		String userName = input.next();
		System.out.println("请输入登陆密码:");
		String password = input.next();
		
		UseMyException ume = new UseMyException();
		try {
			if(ume.login(userName, password)){
				System.out.println("登陆成功!");
			}
		} catch (MyException e) {
			e.printStackTrace();
		}
		
	}

}

执行结果:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

包的命名:范围,从大到小.

公司名.项目名.模块名称.exception

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值