Java常用工具_1.Java异常

Java常用工具_1.Java异常

一、异常

1.什么是异常

异常本质上时程序上的错误

2.错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误

(1)编译期间错误
括号没有正常的配对
语句结束后少写了分号
关键字编写错误
(2)异常:(运行期间的错误)
使用空的对象引用调用方法
数组访问时下标越界
算数运算时除数为0
类型转换时无法正常转型

3.异常:在程序运行过程中,意外发生的情况,背离我们程序本身的意图的表现

4.异常处理机制

Throwable的相关子类

二、Throwable

throwable

1.Error

Error是程序无法处理的错误,表示运行应用程序中较严重的问题。
(1)虚拟机错误:VirtualMachineError
(2)内存溢出:OutOfMemoryError
(3)线程死锁:ThreadDeath
它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况,对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况

2.Exception:

Exception是程序本身可以处理的异常,异常处理通常指针对这种类型异常的处理

3.uncheckedException:

非检查异常:编译器不要求强制处理的异常。包含RuntimeException以及相关子类
(1)空指针异常:NullPointerException
(2)数组下标越界异常:ArrayIndexOutOfBoundsException
(3)算数异常:ArithmeticException
(4)类型转换异常:ClassCastException

4.checkedException:

检查异常:编译器要求必须处置的异常
除了RuntimeException及子类其余都是检查异常
(1)IO异常:IOException
(2)SQL异常:SQLException

三、异常处理

1.在java应用程序中异常处理机制为:

抛出异常、捕捉异常

2.抛出异常:

异常对象:(1)异常类型(2)异常出现时的程序状态(3)…

3.捕获异常

(1)对于运行时异常、错误或可查异常,Java技术所要求的异常处理方式有所不同
(2)Java规定:
对于可查异常必须捕捉或者声明抛出
允许忽略不可查的RuntimeException(含子类)和Error(含子类)

4.异常处理

通过5个关键字来实现:try、catch、finally、throw、throws
try:执行可能产生异常的代码
catch:捕获异常
finally:无论是否发生异常,都会执行的代码
throws:声明可能要抛出的异常
throw:手动抛出异常

四、try-catch-finally

1.try块后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块

2.代码实现

package com.study.test;

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

public class TryDemo1 {
	public static void main(String[] args) {
		// 要求:定义两个整数,接收用户的键盘输入,输出两数之商
		Scanner input = new Scanner(System.in);
		System.out.println("=====运算开始=====");
		try {
			/*
			 * 没有try-catch时
			 * 
			 * 第二个数字输入0
			 * 
			 * Exception in thread "main" java.lang.ArithmeticException: / by zero at
			 * com.study.test.TryDemo1.main(TryDemo1.java:18)
			 */
			/*
			 * 第二个数字输入为a
			 * 
			 * Exception in thread "main" java.util.InputMismatchException at
			 * java.util.Scanner.throwFor(Unknown Source) at java.util.Scanner.next(Unknown
			 * Source) at java.util.Scanner.nextInt(Unknown Source) at
			 * java.util.Scanner.nextInt(Unknown Source) at
			 * com.study.test.TryDemo1.main(TryDemo1.java:13)
			 */
			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("除数不允许为0");
			e.printStackTrace();// 出现位置比较随机,可能输出在运算结束输出语句之前,也可能之后
		} catch (InputMismatchException e) {
			System.out.println("请输入整数");
			e.printStackTrace();
		} catch (Exception e) {// 父类异常应放在最后,可捕获其他异常,如放在前面,则只能捕获此异常
			System.out.println("程序出错");
			e.printStackTrace();
		} finally {
			System.out.println("=====运算结束=====");
		}
	}
}

3.终止finally执行的方法

catch (Exception e) {
			System.exit(1);//终止程序执行
			System.out.println("程序出错");
			e.printStackTrace();
		} 

在这里插入图片描述

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

当try,catch,finally中都有return语句,最终会返回finally中的return语句内容
所以在finally语句中建议不写return语句

package com.study.test;

import java.util.Scanner;

public class TryDemo2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int result = test();
		System.out.println("one和two的商是:" + result);
	}

	public static int test() {
		Scanner input = new Scanner(System.in);
		System.out.println("=====运算开始=====");
		try {
			System.out.print("请输入第一个整数");
			int one = input.nextInt();
			System.out.print("请输入第二个整数");
			int two = input.nextInt();
			return one / two;
		} catch (ArithmeticException e) {
			System.out.println("除数不允许为0");
			return 0;
		} finally {
			System.out.println("=====运算结束=====");
			// return -100000;
		}
	}

}

五、throw&throws

1.可以通过throws声明将要抛出何种类型的异常,通过throw将产生的异常抛出

2.如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throw子句来声明抛出异常

3.代码实现

public void method() throws Exception1,Exception2,...,exceptionN{
	//可能产生异常的代码
}

当方法抛出异常列表的异常时,方法将不对这些类型及其子类类型的异常作处理,而抛向调用该方法的方法,由他去处理。

4.throw用来抛出一个异常

例如:throw new IOException();
throw抛出的只能是可抛出类Throwable或者其子类的实例对象
例如:throw new String(“错误”);
是不允许的

5.方案

package com.study.test;

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

public class TryDemo3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			int result = test();
			System.out.println("one和two的商是:" + result);
		} catch (ArithmeticException e) {
			System.out.println("除数不允许为0");
			e.printStackTrace();
		} catch (InputMismatchException e) {
			System.out.println("请输入整数");
			e.printStackTrace();
		}

	}

	// 通过throws抛出异常时,针对可能出现的多种异常情况解决方案:
	// 1.throws后面接多个异常类型,中间用,分割
	// 2.throws后面接Exception异常
	/**
	 * 测试接收数据相除结果的方法
	 * 
	 * @return 两个接收数据的商
	 * @throws ArithmeticException
	 * @throws InputMismatchException
	 */
	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();
		System.out.println("=====运算结束=====");
		return one / two;
	}

}

6.异常的作用

(1)规避可能出现的风险
(2)完成一些程序的逻辑

六、自定义异常

1.使用Java内置的异常类可以描述在编程时出现的大部分异常情况

2.也可以通过自定义异常描述特定业务产生的异常类型

3.所谓的自定义异常,就是定义一个类,去继承Throwable类或者他的子类

4.代码实现

package com.study.test;

public class HotelAgeException extends Exception {
	public HotelAgeException() {
		super("18-80之外必须由亲友陪同");
	}
}

package com.study.test;

import java.util.Scanner;

public class TryDemo4 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		testAge();
	}

	/*
	 * throw抛出异常对象的处理方案:
	 * 
	 * 1.通过try-catch处理,自己抛自己处理
	 * 
	 * 2.通过throws在方法声明处抛出异常类型-----谁调用谁处理---调用者可以自己处理,也可以继续上抛
	 * 
	 * 此时可以抛出相同类型或者父类,不能子类
	 */
	// 描述酒店的入住规则:限定年龄,18-80之外必须由亲友陪同
	public static void testAge() throws Exception {
		System.out.println("请输入年龄:");
		Scanner input = new Scanner(System.in);
		int age = input.nextInt();
		if (age < 18 || age > 80) {
			// throw new Exception("18-80之外必须由亲友陪同");
			throw new HotelAgeException();
		} else {
			System.out.println("欢迎入住");
		}
	}
}

七、异常链

1.有时我们会捕获一个异常后再抛出另一个异常

2.将异常发生的原因一个传一个串起来,即把底层的异常信息传给上层,这样逐层抛出

3.代码实现

package com.study.test;

public class TryDemo5 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			testThree();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	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;
		}
	}
}

八、关于方法重写时throws的注意事项

1.当子类重写父类抛出异常的方法时,声明的异常必须是父类方法所声明异常的同类或子类

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值