学习Java编程的方法和技巧?
本文重点介绍Java中异常机制的一些概念。写这篇文章的目的是为了方便我在很久以后忘记的情况下,通过这篇文章快速回忆起这些事情。
1.异常机制
1.1
异常机制是指当错误发生时程序如何处理。具体来说,异常机制为程序退出提供了一个安全通道。当出现错误时,程序执行的过程发生变化,程序的控制权转移到异常处理程序。
1.2
传统的处理异常的方式是函数返回一个特殊的结果来表示发生了异常(通常这个特殊的结果是大家都熟知的),调用函数的程序负责检查和分析函数返回的结果。这样做有以下缺点:比如函数返回-1,说明有异常,但如果函数真的返回了-1的正确值,就会出现混乱;可读性降低,程序代码和处理异常的代码混在一起;调用该函数的程序进行的错误分析要求客户程序员对库函数有深刻的理解。
1.3异常处理流程
1.3.1遇到错误,方法立即结束,没有返回值;同时,抛出一个异常对象
1.3.2调用这个方法的程序不会继续执行,而是搜索一个可以处理这个异常的异常处理程序,并执行其中的代码。
2异常的分类
2.1异常的分类
2.1.1
异常的继承结构:基类是Throwable,Error和exception继承Throwable,RuntimeException和IOException,具体的RuntimeException继承RuntimeException。
2.1.2
Error和RuntimeException及其子类将被取消选中,而其他异常将被选中。
2.2每种异常的特征
2.2.1误差系统
错误类系统描述了Java操作系统中的内部错误和资源耗尽。应用程序不应该抛出这种类型的对象(通常由虚拟机抛出)。如果出现这种错误,除了尽最大努力让程序安全退出之外,别无他法。所以在编程的时候,要多关注异常系统。
例外系统
异常系统包括运行时异常系统和其他非运行时异常系统。
1运行时异常
RuntimeException系统包括错误的类型转换、数组越界访问和试图访问空指针。处理RuntimeException的原则是:如果出现RuntimeException,一定是程序员的错。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。
2.2.2.2其他(IOException等。)
这种异常通常是外部错误,比如试图从文件末尾读取数据,这不是程序本身的错误,而是应用环境的外部错误。
2.3不同于C++的异常分类
2.3.1
事实上,Java中的类名RuntimeException并没有正确命名,因为任何异常都是在运行时发生的。(编译时发生的错误不是异常,换句话说,异常是为了解决程序运行时发生的错误而设计的)。
2.3.2
C++中的Logic_error相当于Java中的RuntimeException,而runtime_error相当于Java中的非RuntimeException异常。
3异常使用方法
3.1声明方法抛出异常。
3.1.1语法:throws(缩写)
3.1.2为什么声明方法抛出异常?
方法是否抛出异常与方法返回值的类型一样重要。假设该方法引发异常,并且没有声明该方法将引发异常,则客户端程序员可以调用该方法,而无需编写代码来处理该异常。然后,一旦出现异常,没有合适的异常控制器来解决。
3.1.3抛出的异常为什么一定是被检查的异常?
RuntimeException和Error可以在任何代码中生成,不需要程序员抛出。一旦出现错误,就会自动抛出相应的异常。但是检查异常是程序员抛出的,分为两种情况:客户端程序员调用会抛出异常的库函数(库函数的异常是库程序员抛出的);客户端程序员自己使用throw语句抛出异常。遇到错误时,程序员一般无能为力;如果遇到RuntimeException,一定是程序出现了逻辑错误,要修改程序(相当于调试的一种方法);程序员只关心检查过的异常,程序应该并且应该只抛出或处理检查过的异常。
3.1.4
注意:覆盖父类方法的子类方法不能抛出比父类方法更多的异常。因此,在设计父类方法时,有时会声明抛出异常,但实际实现该方法的代码并不抛出异常。这样做的目的是方便子类方法在覆盖父类方法时抛出异常。
3.2如何抛出异常
3.2.1语法:throw(缩写)
3.2.2抛出什么异常?
对于一个异常对象,真正有用的信息是异常对象类型,异常对象本身是没有意义的。例如,如果异常对象的类型是ClassCastException,那么类名是唯一有用的信息。因此,在选择抛出什么异常时,最重要的是选择一个类,它的类名可以清楚地解释该异常。
3.2.3
异常对象通常有两种构造函数:一种是不带参数的构造函数;另一个是带字符串的构造函数,除了类型名之外,还会作为这个异常对象的附加描述。
3.2.4
创建自己的异常:当Java中的内置异常都不能清楚地解释异常时,就需要创建自己的异常了。需要注意的是,唯一有用的信息是类型名,所以不要把精力花在异常类的设计上。
3.3捕获异常
如果一个异常没有被处理,那么对于一个非图形界面的程序,程序会被挂起并输出异常信息;对于一个图形界面程序,异常信息也会被输出,但程序不会停止,而是会返回到使用“ы拓ఒ"?哎?小?BR & gt3.3.1语法:try、catch、finally(略)
控制器模块必须立即跟随try块。如果抛出异常,异常控制机制将搜索参数与异常类型匹配的第一个控制器,然后进入该catch。
条款,并认为异常已经得到控制。一旦catch子句结束,对控制器的搜索也将停止。
3.3.1.1捕捉多个异常(注意语法和捕捉顺序)(略)
3.3.1.2最终用法和异常处理流程(略)
3.3.2异常处理做什么?
对于Java来说,由于垃圾收集,异常处理不需要回收内存。但是还是有一些资源是程序员需要收集的,比如文件,网络连接,图片。
3.3.3应该声明方法抛出异常还是在方法中捕捉异常?
原则:捕捉并处理你知道如何处理的异常,传递你不知道如何处理的异常。
3.3.4再次抛出异常。
3.3.4.1为什么要再次抛出异常?
在这个级别中,只能处理一部分内容,有些处理需要在更高级别的环境中完成,所以要再次抛出异常。这允许每个级别的异常处理程序处理它可以处理的异常。
3.3.4.2异常处理流程
对应于同一个try块的Catch块将被忽略,抛出的异常将进入更高的级别。
4关于异常的其他问题
4.1过度使用异常
首先,使用异常很方便,所以程序员一般不再愿意写代码处理错误,而只是简单的抛出一个异常。这样做是不对的。对于完全已知的错误,您应该编写代码来处理此类错误,并增加程序的健壮性。另外,异常机制的效率很差。
4.2区分异常和普通错误
对于常见的相同错误,我们应该编写代码来处理这种错误,并增加程序的健壮性。只有无法确定和预测的外部运行时错误才需要使用异常。
4.3异常对象中包含的信息
通常,异常对象的唯一有用信息是类型信息。但是,当使用带有异常字符串的构造函数时,该字符串也可以用作附加信息。调用异常对象的getMessage()、toString()或printStackTrace()方法,可以分别得到异常对象的额外信息、类名和调用栈的信息。后者包含前者的超集。