Android 之路20---Java基础14

导读

1.异常分类
2.异常处理分类
3.try-catch-finally机制
4.throw&throws机制
5.自定义异常类
6.异常链

异常分类

Error表示严重的错误,即使出现也并不是程序本身的问题,一般不予以关注

Unchecked Exception:编译器不要求强制处理的异常

包括RuntimeException及其子类

Checked Exception:编译器必须处理异常,即编译时异常

如:IOException, SQLException

异常处理分类

try-catch-finally机制

try块:用于捕获异常
catch块:用于处理try捕获到的异常
finally块:无论是否捕获到异常,都可以执行

在这里插入图片描述

package com.hala.exception;

import java.util.Scanner;

public class Demo1 {
	public static void main(String[] args){
		
		Scanner input=new Scanner(System.in);
		try{
		System.out.println("+++++++运算开始+++++++");
		System.out.print("请输入第一个数:");
		int one=input.nextInt();
		System.out.print("请输入第二个数:");
		int two=input.nextInt();
		System.out.println("one和two的商是:"+(one/two));
		}catch(Exception e){
			System.out.println("程序出错了~~");
			//此句作用为打印错误信息
			e.printStackTrace();
		}
		finally{
			System.out.println("+++++++运算结束+++++++");
		}
		
		System.out.println("谢谢使用");
	}

}

输出结果

+++++++运算开始+++++++
请输入第一个数:12
请输入第二个数:0
程序出错了~~
java.lang.ArithmeticException: / by zero
+++++++运算结束+++++++
谢谢使用
at com.hala.exception.Demo1.main(Demo1.java:15)

多个catch块

import java.util.Scanner;

public class Demo1 {
	public static void main(String[] args){
		
		Scanner input=new Scanner(System.in);
		try{
		System.out.println("+++++++运算开始+++++++");
		System.out.print("请输入第一个数:");
		int one=input.nextInt();
		System.out.print("请输入第二个数:");
		int two=input.nextInt();
		System.out.println("one和two的商是:"+(one/two));
		//算术异常
		}catch(ArithmeticException e){
			System.out.println("除数不允许为零");
			//此句作用为打印错误信息
			e.printStackTrace();
		//输入格式异常
		}catch(InputMismatchException e){
			System.out.println("请输入整数");
			e.printStackTrace();
		//异常的父类要放在最后
		}catch(Exception e){
			System.out.println("出错了~~");
			e.printStackTrace();
		}
		finally{
			System.out.println("+++++++运算结束+++++++");
		}
		
		System.out.println("谢谢使用");
	}

}

输出结果
请输入第一个数:12
请输入第二个数:0
除数不允许为零
java.lang.ArithmeticException: / by zero+++++++运算结束+++++++
谢谢使用

at com.hala.exception.Demo1.main(Demo1.java:16)

+++++++运算开始+++++++
请输入第一个数:12
请输入第二个数:4.5
请输入整数
java.util.InputMismatchException
+++++++运算结束+++++++
谢谢使用
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at com.hala.exception.Demo1.main(Demo1.java:15)

终止finally的方法

package com.hala.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Demo1 {
	public static void main(String[] args){
		
		Scanner input=new Scanner(System.in);
		try{
		System.out.println("+++++++运算开始+++++++");
		System.out.print("请输入第一个数:");
		int one=input.nextInt();
		System.out.print("请输入第二个数:");
		int two=input.nextInt();
		System.out.println("one和two的商是:"+(one/two));
		}catch(ArithmeticException e){
			System.out.println("除数不允许为零");
			System.exit(1);
			//此句作用为终止程序,其后的语句均不会执行
			e.printStackTrace();
		}catch(InputMismatchException e){
			System.out.println("请输入整数");
			e.printStackTrace();
		}catch(Exception e){
			System.out.println("出错了~~");
			e.printStackTrace();
		}
		finally{
			System.out.println("+++++++运算结束+++++++");
		}
		
		System.out.println("谢谢使用");
	}

}

输出结果

+++++++运算开始+++++++
请输入第一个数:12
请输入第二个数:0
除数不允许为零

return关键字在异常处理中的作用

package com.hala.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Demo1 {
	public static void main(String[] args){
		int result=test();
		System.out.println("one和two的商是:"+result);
	}
	
	public static int test(){
		Scanner input=new Scanner(System.in);
		try{
		System.out.println("+++++++运算开始+++++++");
		System.out.print("请输入第一个数:");
		int one=input.nextInt();
		System.out.print("请输入第二个数:");
		int two=input.nextInt();
		return (one/two);
		}catch(ArithmeticException e){
			System.out.println("除数不允许为零");
			return 0;
		}finally{
			System.out.println("+++++++运算结束+++++++");
			return -1;
		//这里注意一旦finally中有了return那么他会覆盖前边的return值
		//即这个函数始终返回-1
		}
		
	}

}

输出结果

+++++++运算开始+++++++
请输入第一个数:12
请输入第二个数:3
+++++++运算结束+++++++
one和two的商是:-1

+++++++运算开始+++++++
请输入第一个数:12
请输入第二个数:0
除数不允许为零
+++++++运算结束+++++++
one和two的商是:-1

package com.hala.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Demo1 {
	public static void main(String[] args){
		int result=test();
		System.out.println("one和two的商是:"+result);
	}
	
	public static int test(){
		Scanner input=new Scanner(System.in);
		try{
		System.out.println("+++++++运算开始+++++++");
		System.out.print("请输入第一个数:");
		int one=input.nextInt();
		System.out.print("请输入第二个数:");
		int two=input.nextInt();
		return (one/two);
		}catch(ArithmeticException e){
			System.out.println("除数不允许为零");
			return 0;
		}finally{
			System.out.println("+++++++运算结束+++++++");
		}
		
	}

}

输出结果
+++++++运算开始+++++++
请输入第一个数:12
请输入第二个数:0
除数不允许为零
+++++++运算结束+++++++
one和two的商是:0

throw&throws机制

throws

处理方法1

package com.hala.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Demo1 {
	public static void main(String[] args){
			try {
				int result=test();
				System.out.println("one和two的商是:"+result);
				System.out.println("+++++++运算结束+++++++");
			} catch (InputMismatchException e) {
				System.out.println("除数不能为0");
				e.printStackTrace();
			} catch (ArithmeticException e) {
				System.out.println("请输入一个整数");
				e.printStackTrace();
			}
	}
	/*通过throws抛出异常时,针对可能出现的多种异常,处理情况:
	 * 1.throws后边接多个异常类型,用逗号分隔
	 * 2.
	 */
	public static int test() throws ArithmeticException,InputMismatchException {
		Scanner input=new Scanner(System.in);
		System.out.println("+++++++运算开始+++++++");
		System.out.print("请输入第一个数:");
		int one=input.nextInt();
		System.out.print("请输入第二个数:");
		int two=input.nextInt();
		return (one/two);
	}

}

输出结果

+++++++运算开始+++++++
请输入第一个数:12
请输入第二个数:0
请输入一个整数
java.lang.ArithmeticException: / by zero
at com.hala.exception.Demo1.test(Demo1.java:30)
at com.hala.exception.Demo1.main(Demo1.java:9)

⚠️这个处理异常有快捷键

右键需要加try-catch的地方->Surround With->Try/catch Block
Try/catch Block:每个Exception类型占一个catch
Try/multi-catch Block:多个Exception类型占一个catch

处理方法2

package com.hala.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Demo1 {
	public static void main(String[] args){
			try {
				int result=test();
				System.out.println("one和two的商是:"+result);
				System.out.println("+++++++运算结束+++++++");
			} catch (InputMismatchException e) {
				System.out.println("除数不能为0");
				e.printStackTrace();
			} catch (ArithmeticException e) {
				System.out.println("请输入一个整数");
				e.printStackTrace();
			}catch(Exception e){
				System.out.println("出错了~~");
				e.printStackTrace();
			}
	}
	/*通过throws抛出异常时,针对可能出现的多种异常,处理情况:
	 * 1.throws后边接多个异常类型,用逗号分隔
	 * 2.throws后边直接接Exception,注意处理时catch中一定要有针对Exception的处理
	 */
	public static int test() throws Exception {
		Scanner input=new Scanner(System.in);
		System.out.println("+++++++运算开始+++++++");
		System.out.print("请输入第一个数:");
		int one=input.nextInt();
		System.out.print("请输入第二个数:");
		int two=input.nextInt();
		return (one/two);
	}

}

输出结果

+++++++运算开始+++++++
请输入第一个数:12
请输入第二个数:0
请输入一个整数
java.lang.ArithmeticException: / by zero
at com.hala.exception.Demo1.test(Demo1.java:34)
at com.hala.exception.Demo1.main(Demo1.java:9)

throw

package com.hala.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Demo1 {
	public static void main(String[] args) {
		try {
			test();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
//这里注意throws后边的异常必须是throw后边的父类或者本身,不能是其子类
	public static void test() throws Exception {
		Scanner input=new Scanner(System.in);
		System.out.print("请输入你的年龄:");
		int a=input.nextInt();
		if(a<18||a>80){
			throw new Exception("年龄必须在18岁与80岁之间!");
		}else{
			System.out.println("欢迎入住~~");
		}
		
	}

}

输出结果

请输入你的年龄:2
java.lang.Exception: 年龄必须在18岁与80岁之间!
at com.hala.exception.Demo1.test(Demo1.java:21)
at com.hala.exception.Demo1.main(Demo1.java:9)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

自定义异常类

HotelAgeException类

package com.hala.exception;

public class HotelAgeException extends Exception{

	public HotelAgeException(){
		super("年龄必须在18岁与80岁之间!");
	}
}

Demo1类

package com.hala.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Demo1 {
	public static void main(String[] args) {
		try {
			test();
		} catch (HotelAgeException e) {
			//e.getMessage()是用于获得自定义类的信息的
			System.out.println(e.getMessage());
			e.printStackTrace();
		}

	}

	public static void test() throws HotelAgeException {
		Scanner input=new Scanner(System.in);
		System.out.print("请输入你的年龄:");
		int a=input.nextInt();
		if(a<18||a>80){
			throw new HotelAgeException();
		}else{
			System.out.println("欢迎入住~~");
		}
		
	}

}

输出结果

请输入你的年龄:12
年龄必须在18岁与80岁之间!
com.hala.exception.HotelAgeException: 年龄必须在18岁与80岁之间!
at com.hala.exception.Demo1.test(Demo1.java:22)
at com.hala.exception.Demo1.main(Demo1.java:9)

异常链

package com.hala.exception;

public class HotelAgeException extends Exception{

	public HotelAgeException(){
		super("年龄必须在18岁与80岁之间!");
	}
}

package com.hala.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Demo1 {
	public static void main(String[] args)  {
		try {
			testThree();
		}  catch (Exception e) {
			e.printStackTrace();
		}

	}

	//异常链的逻辑
	/*
	 * 主函数catch信息=testThree()的throws信息
	 * 主函数testThree() catch信息=testTwo()的throws信息
	 * 主函数testTwo() catch信息=testOne()的throws信息
	 */
	public static void testOne() throws HotelAgeException{
		throw new HotelAgeException();
	}
	
	public static void testTwo() throws Exception{
		try {
			testOne();
		} catch (HotelAgeException e) {
			//两种写法可以打印整条异常链
			//写法一
		throw new Exception("我是异常1",e);
		}
	}
	
	public static void testThree() throws Exception{
		try {
			testTwo();
		} catch (Exception e) {
			//写法二
			Exception e1=new Exception("我是异常2");
			e1.initCause(e);
			throw e1;
		}
	}

}

输出结果

java.lang.Exception: 我是异常2
at com.hala.exception.Demo1.testThree(Demo1.java:32)
at com.hala.exception.Demo1.main(Demo1.java:9)
Caused by: java.lang.Exception: 我是异常1
at com.hala.exception.Demo1.testTwo(Demo1.java:24)
at com.hala.exception.Demo1.testThree(Demo1.java:30)
… 1 more
Caused by: com.hala.exception.HotelAgeException: 年龄必须在18岁与80岁之间!
at com.hala.exception.Demo1.testOne(Demo1.java:17)
at com.hala.exception.Demo1.testTwo(Demo1.java:22)
… 2 more

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值