java异常处理学习笔记

原创 2013年12月04日 10:20:18

try块与if语句不一样,try块后的花括号不可以省略,即使只有一行代码,也不能省略花括号。与之类似的是catch块后的花括号也不可以省略

 

try块里声明的变量是代码块内局部变量,它只在try块内有效,在catch块中不能访问。

 

 

不管try块中的代码是否出现异常,也不管哪一个catch块被执行,甚至在try块或者catch块中执行了return语句,finally块总会被执行。

 

异常处理语法结构中只有try块是必需的,也就是说,如果没有try块,则不能有后面的catch块和finally块,catch块和finally块是可选的,但catch块和finally块至少出现其中之一,也可以同时出现多个catch块,捕获父类异常的catch块必需位于捕获子类异常后面,finally块必需位于所有catch块之后。

 

虽然return语句也强制方法结束,但一定会先执行finally块里的代码。如果在异常处理代码中使用System.exit(1)语句来退出虚拟机,则finally块将失去执行的机会

 

通常情况下,不要在finally块中使用return或者throw等导致方法终止的语句,一旦使用将会导致try块、catch块中的retrun、throw语句失效。

 

当java程序执行try块、catch块时遇到了return 或throw语句,这两个语句都会导致该方法立即结束,但是系统执行这两个语句并不会结束该方法,而是去勋章该异常处理流程中是否包含finally块,如果没有程序立即执行return或throw语句,方法终止;如果有finally块,系统立即开始执行finally块——只有当finally块执行完成后,系统才会再次跳回来执行try块、catch块里的return或throw语句;如果finally块里也使用return或throw等导致方法终止的语句,finally块已经终止了方法,系统将不会调回去执行try块、catch块里的任何代码

 

下面是一道面试题

public class ThreeException extends Exception{

}

 

public class TestClass {

	static int count = 0;
	
	public static void main(String[] args) {
		
		while(true){
			try{
				if(count++==0)
					throw new ThreeException();
				System.out.println("No Exception");
			}catch(ThreeException e){
				System.err.println("ThreeException");
			}catch(Exception e){
				System.err.println("Exception");
			}finally{
				System.err.println("Finally");
				if(count==2) break;
			}
		}
		
	}

}

 打印结果:

ThreeException

Finally

No Exception

Finally

 

Java异常被分为两大类:checked异常和Runtime异常(运行时异常)。所有RuntimeException类及其子类的实例被称为Runtime异常;不是RuntimeException类及其子类的异常实例则被称为checked异常。

对于checked异常的处理方式有如下两种:

1、当前方法明确知道如何处理该异常,程序应该使用try...catch块来捕获该异常,然后在对应的catch块中修复该异常

2、当前方法不知道如何处理这种异常,应该在定义该方法时声明抛出该异常。

 

使用throws声明抛出异常的思路是,当前方法不知道如何处理这种类型的异常,该异常应该由上一级调用者处理,如果main方法也不知道如何处理这种类型的异常,也可以使用throws声明抛出异常,该异常交给JVM处理。

JVM对异常处理的方法是打印异常的跟踪栈信息,并中止程序运行,这就是前面程序在遇到异常后自动结束的原因

 

如果某段代码中调用了一个带throws声明的方法,该方法声明抛出了Checked异常,则表明该方法希望它的调用者来处理该异常。也就是说,调用该方法时要么放在try块中显示捕获该异常,要么放在另一个带throws声明抛出的方法中。

 

使用throws声明抛出异常时有一个限制,就是方法重写时“两小”中的一条规则:子类方法声明抛出的异常类型应该是父类方法声明抛出的异常类型的子类或相同,子类方法声明抛出的异常不允许比父类方法声明抛出的异常多。

 

如果需要在程序中自行抛出异常,则应该使用throw语句,throw语句可以单独使用,throw语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例。

 

当java运行时接受到用户自行抛出的异常时,同样会中止当前的执行流,跳到该异常对应的catch块,有该catch块来处理该异常。也就是说,不管是系统自动抛出异常,还是程序员手动抛出的异常,java运行时环境对异常的处理没有任何差别。

 

用户自定义异常都应该继承Exception基类,如果希望自定义Runtime异常,则应该继承RuntimeException基类。定义异常类时通常需要提供两个构造器:一个是无参数的构造器;另一个是带一个字符串参数的构造器,这个字符串将作为该异常对象的描述信息(也就是异常对象的getMessage()方法返回的值)。

 

public class MyException extends Exception{
	//无参数的构造器
	public MyException(){}
	//带一个字符串参数的构造器
	public MyException(String msg){
		super(msg);
	}
}

 

如果需要自定义Runtime异常,只需要将继承类Exception改为RuntimeException基类即可。

 

虽然printStackTrace()方法可以很方便地用于追踪异常的发生情况,可以用它来调试程序,但是在最后发布的程序中,应该避免使用它;而应该对捕获的异常进行适当的处理,而不是简单地将异常的跟踪栈信息打印出来。

 

必须指出:异常处理机制的初衷是将不可预料的异常处理代码和正常的业务逻辑处理分离,因此绝不要使用异常处理来替代正常的业务逻辑判断。

异常机制的效率比正常流程控制效率差,所以不要使用异常处理来替代正常的程序流程控制。

 

把捕获一个异常然后接着抛出另一个异常,并把原始异常信息保存下来是一种典型的链式处理,也被称为“异常链”。

这种把原始异常信息隐藏起来,仅向上提供必要的异常提示信息的处理方式,可以保证底层异常不会扩散到表现层,可以避免向上暴露太多的实现细节,这完全符合面向独享的封装原则

 

不要使用过于庞大的try块:

try块里的代码过于庞大导致业务过于复杂,会造成try块中出现异常的可能性大大增加,从而导致分析异常原因的难度也加大,紧随后面的catch块才可以针对不同的处理逻辑关系难度也加大,反而增加了编程复杂度。

正确做法是将大块的try块分割成多个可能出现异常的程序段落,并把他们房子单独的try块中,从而分别捕获并处理异常。

  • 大小: 24.2 KB

相关文章推荐

《Java异常处理》学习笔记

1.异常处理对性能的影响 一般来说,在Java程序中使用try…catch语句不会对应用的性能造成很大的影响。仅仅当异常发生时,Java虚拟机需要执行额外的操作,来定位处理异常的代码块,这是会对性能...

JAVA学习笔记(异常处理)

关于finally块的运行顺序,在学习阶段不是很明确。查询了一些资料后,大概可以得出以下结论:“finally块是在下级函数向上级调用的函数跳转前(无论是通过return还是throw excepti...
  • fatever
  • fatever
  • 2017年05月12日 09:20
  • 133

Java语言异常处理学习笔记续

前一篇写的几个程序让我们知道了如果框架中出现退出程序的语句异常处理机制是如何运行的,那么如果框架中出现return语句结果又如何呢? public class TryCatch{  public ...

Java学习笔记——自定义异常处理

例子阐述:通过三层架构来完成输入的数字必须是整型,如果不符合,抛出异常且日志记录 自定义异常; public class LovoException extends Excepti...

尚硅谷java学习笔记——6.异常处理

q

【Java学习笔记】异常处理

Java异常概念 java异常的分类 异常的捕获和处理是指在运行期出现的错误 观察错误的名字和行号最重要 异常的概念 Java异常是Java提供的用于处理程序中错误的一种机制。 所谓错误是指在程序运行...

java学习笔记9——异常处理

在java编程中,有一个特殊的机制叫做异常处理,这里进行一下总结。

java学习笔记七——异常处理

****Java异常处理**** 异常:程序中出现错误导致中断了正常的指令流。 编译错误逻辑错误都不是异常,异常是可以正常运行的程序在运行中可能发生的错误。没有异常处理的代码可能非正常结束出现严重的...

Java语言异常处理学习笔记

学习过java的都知道异常处理的框架: 它的执行过程一般分为两条线: 1.try语句块中没有异常,则正常执行try语句块,catch和finally中的语句不被执行。 2.try语句中有异常...

Java学习笔记--异常处理

我们在写程序的时候经常会出现许多意想不到的错误,在Java中,错误也是被包装成了各种子类实例。只要我们能捕捉到包装错误的对象,就能做出对应的处理方式。 语法与继承架构使用try,catch Jav...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java异常处理学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)