异常的捕获与处理

异常

概念:异常是指在程序运行中所发生的不正常的事件,它会中断正在运行的程序。

异常的本质就是Java对可能出现的问题进行描述的一种对象体现。

异常的分类:

异常:我们可以处理。

​ 编译时异常:只要是Exception的子类,但同时不是RuntimeException的子类称为编译时异常。

​ 运行时异常:只要是RuntimeException或者是RuntimeException的子类称为运行时异常。

错误:我们无法处理。

Java提供了完整异常体系框架:顶层父类是Throwable

为什么将Throwable设计成类?而不是抽象类或者是接口?

因为Throwable的所有子类都没有自己的方法,都是来自于Throwable。

异常处理

异常处理的目的:

一:保证程序继续执行

二:打印错误信息给程序员进行调试

异常处理格式:

try {

//有可能出现异常的语句;

}catch(异常类型 对象){

//异常处理;

}catch(异常类型 对象){

//异常处理;

}catch(异常类型 对象){

//异常处理;

}finally{

//不管是否出现异常,都会执行的代码;(如果不需要finally,可以省略)

}

注意:

1.程序一旦在try 块中出现异常,无论try 块中该异常语句下面有多少行代码,都不会被执行。

2.一般Exception作为异常接收放在catch块的最后面,用来接收所有异常,保证程序可以继续执行。

public class Demo {
	public static void main(String[] args) {
		System.out.println("start");
		try {
			System.out.println("数学计算:" + (10 / 0));//一旦这里捕获到异常,try后面的所有代码均不会被执行
			System.out.println("程序执行中");
		} catch (NullPointerException ne) {
			System.out.println("空指针异常");//匹配不成功,继续往下匹配
		}
		/*  catch (ArithmeticException ae) {
			System.out.println("除数不能为0");//匹配成功,输出异常信息
		}*/ 
		catch (Exception e) {  //一般会在异常处理的最后面填写Exception接收所有异常,保证程序安全性
			e.printStackTrace();//输出虚拟机捕获到的异常信息
		} finally {
			System.out.println("不管是否有异常,我都会执行!");
		}
		System.out.println("over");
	}
}

throws关键字

throws抛异常,抛出给调用者处理

throws方式处理异常

[访问权修饰符] 返回值类型 方法名(参数列表) [throws 异常类名] {

方法体

}

public class Demo02 {
	public static void main(String[] args) {
		method1();
	}

	private static void method1() throws ArithmeticException {
		try {
			method2();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void method2() throws ArithmeticException {
		int a = 10;
		int b = 0;
		System.out.println(a / b);
		System.out.println("over");
	}
}
注意:

1.如果是主方法,我们必须处理,因为我们不处理JVM会处理,JVM会将程序结束,不满足异常处理的本质2.

2.如果一个方法抛出一个异常,那么子类不能抛出的异常不能够被放大

3.我们可以在一个方法上声明多个异常,中间使用逗号隔开,表示异常出现的可能性

4.当一个方法抛出的是一个编译时异常的时候,必须处理,不处理就会报错

throw关键字

格式:

throw 异常对象;

throw和throws的区别:

1.throws是在方法的声明上,throw是在方法体内

2.throws声明的是异常类,并且可以声明多个,throw抛出的是异常对象,只能够抛出一个

3.throws表示异常出现的可能性,throw表示异常出现的必然性

public class Demo03 {
	public static void main(String[] args) {
		System.out.println("start");

		try {
			method1();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void method1() throws ArithmeticException {
		int a = 10;
		int b = 0;
		if (b == 0) {
			throw new ArithmeticException("除数不能为0");
		}
		System.out.println(a / b);
		System.out.println("over");
	}
}

自定义异常

1.书写自定义异常继承Exception,RuntimeException

2.书写构造方法

  • 无参
  • 带错误信息的参数
/*自定义异常
* 异常本质就是Java当中对可能出现的问题进行描述的一种对象体现
* 要求考试成绩必须在0-100之间*/
public class Demo04 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("请输入分数:");
		double score = input.nextDouble();
		try {
			System.out.println(isBetween0To100(score));
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (input != null) {
				input.close();
			}
		}
	}

	public static boolean isBetween0To100(double score) throws ScoreExcepticon {
		if (score < 0 || score > 100) {
			throw new ScoreExcepticon("分数必须在0-100之间");
		}
		return true;

	}
}

class ScoreExcepticon extends Exception {

	private static final long serialVersionUID = 1L;

	public ScoreExcepticon() {
		super();
	}

	public ScoreExcepticon(String s) {
		super(s);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值