Java期末复习—异常处理

首先是一个在复习资料上看到的简答题,据加瓦老师说,考试要出异常处理的简答题<(_ _)> ;

简述 Java 中异常处理的机制
答:首先 Java 的异常是面向对象的。一个 Java 的 Exception 是一个描述异常情况的对象,当出异常情况时,一个 Exception 对象就产生了,并放到异常的成员函数里。
Java 的异常处理是通过5 个关键词来实现的:try,catch,throw,throws 和 finally。
1.异常处理:在 Java 语言的错误处理结构由 try,catch,finally 三个块组成
其中 try 块存放将可能发生异常的 Java 语言,并管理相关的异常指针;catch 块紧跟在 try 块后面,用来激发被捕获的异常;finally 块包含清除程序没有释放的资源,句柄等。不管 try 块中的代码如何退出,都将执行 finally 块。
2.抛出异常:Java 语言可以不在方法中直接捕获,而用 throw 语句将异常抛给上层的调用者。Throw 语句就是来明确地抛出一个异常;首先你必需得到一个Throwable 的实例句柄,通过参数传到 catch 中,或者采用 new 操作符来创建一个。


throw关键字(手动制造一个异常)

语法:throw new 异常类型() ;

public class Throw {
	public static void main(String[] args) {
		int time = -100 ;
		try {
			if(time < 0) {
				throw new ArithmeticException("时间为负:"+time) ;
			}
			System.out.println("时间为:"+time) ;
		} catch(Exception e) {
			e.printStackTrace();
			System.out.println("捕捉到异常") ;
		}
	}
}
public class Throw {
	public static void main(String[] args) {
		try {
			int a = 1 , b = 0 ;
			if(b == 0) {
				throw new NullPointerException("除数为零") ; //异常发生前,拦截异常
			}
			int c = a/b ;
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
}

一旦某个catch捕获到匹配的异常类型,将进入异常处理代码。一经处理结束,就意味着整个try-catch语句结束。其他的catch子句不再有匹配和捕获异常类型的机会。 

throws关键字(将代码中的异常交给别人来处理)

语法:

public void method() throws 异常1 ,异常2 ,... , 异常n {   }

被调用时:

try{
    method() ;
}catch(异常类型 e){
    e.printStackTrace() ;
}

具体— 

public class Throw {
	public static void show() throws InterruptedException , NullPointerException , Exception {
		for(int i = 0 ; i < 10 ; i ++) {
			System.out.println(i) ;
			Thread.sleep(1000); //休眠一秒
		}
	}
	public static void main(String[] args) {
		try {
			show() ;
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NullPointerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

课后题一:说明try-catch-finally结构的执行次序。

1)当try没有捕获到异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句;

2)当try捕获到异常,catch语句块里没有处理此异常的情况:当try语句块里的某条语句出现异常时,而没有处理此异常的catch语句块时,此异常将会抛给JVM处理,finally语句块里的语句还是会被执行,但finally语句块后的语句不会被执行;

3)当try捕获到异常,catch语句块里有处理此异常的情况:在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将跳到catch语句块,并与catch语句块逐一匹配,找到与之对应的处理程序,其他的catch语句块将不会被执行,而try语句块中,出现异常之后的语句也不会被执行,catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句;

 

1) 如果是不可查异常(unchecked exception),即Error、RuntimeException或它们的子类,那么可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。

2)必须声明方法可抛出的任何可查异常(checked exception)。即如果一个方法可能出现受可查异常,要么用try-catch语句捕获,要么用throws子句声明将它抛出,否则会导致编译错误

3)仅当抛出了异常,该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出,而不是囫囵吞枣。

4)调用方法必须遵循任何可查异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类。

课后题二:说明throw语句和throws语句有什么不同。

throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
throws语句用在方法声明后面,表示抛出异常,由该方法的调用者来处理。

throws出现在方法函数头;而throw出现在函数体里。
throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。

两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常。

 课后题三:简述try-catch-finally 规则(异常处理语句的语法规则):

1)  必须在 try 之后添加 catch 或 finally 块。try 块后可同时接 catch 和 finally 块,但至少有一个块。
2) 必须遵循块顺序:若代码同时使用 catch 和 finally 块,则必须将 catch 块放在 try 块之后。
3) catch 块与相应的异常类的类型相关。
4) 一个 try 块可能有多个 catch 块。若如此,则执行第一个匹配块。即Java虚拟机会把实际抛出的异常对象依次和各个catch代码块声明的异常类型匹配,如果异常对象为某个异常类型或其子类的实例,就执行这个catch代码块,不会再执行其他的 catch代码块
5) 可嵌套 try-catch-finally 结构。
6) 在 try-catch-finally 结构中,可重新抛出异常。
7) 除了下列情况,总将执行 finally 做为结束:JVM 过早终止(调用 System.exit(int));在 finally 块中抛出一个未处理的异常;计算机断电、失火、或遭遇病毒攻击。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值