栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java之异常

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java之异常

文章目录
  • 1.try-catch
    • (1)情况1
    • (2)情况2
    • (3)情况3
    • (4)多重catch
  • 2.try-catch-finally
  • 3.throws
  • 4.throw
  • 5.自定义异常
  • 6.原则问题
  • 7.面试题
    • (1)
    • (2)


并不是编译错误

Java的异常处理是通过5个关键字来实现的:
try、catch、 finally、throw、throws

1.try-catch (1)情况1

try块中所有语句正常执行完毕,不会发生异常,那么catch块中的所有语句都将会被忽略。

> public void method(){ 
> try {   
> // 代码段(此处不会产生异常) 
> }catch (异常类型 ex) {
>       // 对异常进行处理的代码段 
>  }  
>       // 代码段 
> }
(2)情况2

try语句块在执行中遇到异常,那么在try块中其余剩下的代码都将被忽略,系统会自动生成相应的异常对象,如果这个异常对象与catch中声明的异常类型相匹配,则相应的catch块将会被执行。

public void method(){
try {
      // 代码段 1
      // 产生异常的代码段 2
      // 代码段 3
} catch (异常类型 ex) {
      // 对异常进行处理的代码段4
}
// 代码段5
}

(3)情况3

try语句块在执行中遇到异常,如果这个异常对象与catch中声明的异常类型不匹配,程序会中断。

public void method(){
try {
     // 代码段 1
     // 产生异常的代码段2
     // 代码段 3
} catch (异常类型 ex) {
     // 对异常进行处理的代码段4
}
// 代码段5
}

(4)多重catch

一段代码可能会引发多种类型的异常,而我们统一按照Exception类型捕获。
如果要分别捕获,就可以使用多重catch块。

引发多种类型的异常
1.排列catch 语句的顺序:先子类后父类
2.发生异常时按顺序逐个匹配
3.只执行第一个与异常类型匹配的catch语句

public void method(){
try {
     // 代码段
     // 产生异常(异常类型2)
} catch (异常类型1 ex) {
     // 对异常进行处理的代码段
} catch (异常类型2 ex) {
     // 对异常进行处理的代码段
} catch (异常类型3 ex) {
     // 对异常进行处理的代码段
}
// 代码段
}

2.try-catch-finally

在try-catch块后加入finally块
是否发生异常都执行
不执行的唯情况

public void method(){
try {
     // 代码段 1
     // 产生异常的代码段 2
} catch (异常类型 ex) {
     // 对异常进行处理的代码段3
     return;
}finally{
      // 代码段 4
}
}

3.throws

如果在一个方法体中抛出了异常,我们希望调用者能及时捕获异常,如何通知调用者?

1.Java语言中通过关键字throws声明某个方法可能抛出的各种异常。
2.throws可以同时声明多个异常,多个异常用逗号隔开。

如果把计算并输出商的任务封装在divide()方法中,并在方法的参数列表后通过throws声明了异常,然后在main()方法中调用该方法,此时main()方法就知道divide()方法中抛出了异常,可以采取以下两种方式进行处理。

方式1:调用者通过try-catch捕获并处理异常。
方式2:调用者通过throws继续声明异常。如果调用者不打算处理该异常,则可以继续通过throws声明异常,让上一级调用者处理异常。

main()方法声明的异常将由Java虚拟机来处理。

public class Test7 {
	public static void divide() throws Exception,----,----,---- {
		  //可能出现异常的代码
	}
	public static void main(String[] args) {
		 try {
			divide();
		 } catch (Exception e) {
			e.printStackTrace();
		 }
	}
//	public static void main(String[] args) throws Exception {
//		 divide();
//	}
}
4.throw

既然可以捕获到各种类型的异常,那么这些异常是在什么地方抛出的呢?

除了系统自动抛出异常外,在编程过程中,我们往往遇到这样的情形:有些问题是系统无法自动发现并解决的,如年龄不在正常范围内、性别输入不是“男”或“女”等,此时需要程序员而不是系统来自行抛出异常,把问题提交给调用者去解决。

Java语言中通过关键字throw来自行抛出异常

public class Person {
	private String name = "";   // 姓名
	private int age = 0;   // 年龄
	private String sex = "男";  // 性别
	public void setSex(String sex) throws Exception {
		if ("男".equals(sex) || "女".equals(sex))
			this.sex = sex;
		else {
			throw new Exception(“性别必须是"男"或者"女"!");
		}
	}
}
5.自定义异常

当JDK 中的异常类型不能满足程序的需要时,可以自定义异常类。

使用自定义异常的步骤

6.原则问题

异常处理与性能
异常只能用于非正常情况
不要将过于庞大的代码块放在try中
在catch中指定具体的异常类型
需要对捕获的异常做处理

7.面试题 (1)

try-catch块中存在return语句,是否还执行finally块,如果执行,说出执行顺序?

try-catch- finally块中,finally块唯一不执行的情况是什么?

1、不管有没有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

(2)

请说出throw和throws的区别?

1.throw和throws的区别表现在以下三个方面 作用不同: throw用于在程序中抛出异常; throws用于声明在该方法内抛出了异常。
2.使用的位置不同:throw位于方法体内部,可以作为单独语句使用; throws必须跟在方法参数列表后面,不能单独使用。 内容不同:
3. throw抛出一个异常对象,而且只能是一个;throws后面跟异常类,而且可以跟多个异常类。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1036702.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号