java什么是异常?描述下异常处理?,JAVA什么是异常处理
如何解决写爬虫IP受阻的问题?立即使用。
什么是异常?
结构不良的代码是无法运行的,这是Java的基本思想。
发现错误的理想时间是在编译时。但是编译器并不能发现所有的错误,剩下的问题需要在程序运行的时候解决。这就要求错误能够以某种方式将适当的信息传递给特定的接收者。
Java中异常处理的目的是用少量的代码简化大型可靠程序的生成,使你的应用程序中不存在未处理的错误,同时也带来了一个明显的好处:降低错误处理代码的复杂度。
不正常,从字面上看,就是意料之外的意思。放到代码层面去理解,就是阻止当前的方法或者范围继续执行。异常是阻止程序按预期执行的事件。有三种类型的异常——检查异常、错误和运行时异常。
在Java中,异常被视为对象,它们的基类是可抛出的。
Java中的异常类型
异常和错误直接源自Java Throwable。异常是可以抛出的基本类型。异常类型的异常可能在Java类库、方法和运行时故障中抛出。异常是指可恢复的异常,可以被编译器捕获;错误是指编译时和系统错误,是指系统在运行过程中出现了严重的错误,而且是不可恢复的错误。因为是JVM级别的严重错误,这个错误会导致程序终止执行。异常分为检查异常和运行时异常。
异常类的层次结构图如下:
典型的RuntimeException包括nullpointerexception、classcastexception、IndexOutOfBoundsException、IllegalArgumentException、ArrayStoreException(数组存储异常)、AruthmeticException(算术异常)、BufferOverflowException(缓冲区溢出异常)等。
非RuntimeException(检查异常)包括IoException、SQLException、中断异常(中断异常——调用线程休眠时)、NumberFormatException(数字格式化异常)等。
根据编译器检查方法,异常可以分为CheckedException和UncheckedException。Error和RuntimeException统称为UncheckedException。之所以这样称呼它们,是因为编译器不检查方法是处理还是抛出这两种类型的异常,所以这种类型的异常在编译期间不会被报告。默认情况下,虚拟机提供处理方法。除了Error和RuntimeException之外,其他异常都称为检查异常。
Java如何处理异常
试着抓住,试着抓住,试着抓住
对于检查类型异常,我们要么处理它,要么在方法头中抛出它。
公共静态void createFile()引发IOException{
File File=new File( C:/test . txt );
如果(!file.exists()){
file . create new file();
}
}
公共静态void main(String[] args) {
尝试{
create file();
} catch (IOException ex) {
//在此处理异常
}
}关于catch的几点注意事项:
1)参数的异常类型必须是Throwable类或其子类。
2)对于自顶向下的catch语句,参数类型必须按照从子类到父类的顺序,因为一旦匹配了一个类型,后续的catch就会被忽略。例如,IOException必须放在Exception之前,否则编译器会报告错误。
3)可以有一个或多个catch语句,或者即使有finally语句,也不能有catch语句,比如try-finally。
如果要捕获多个异常,可以使用多个catch语句。JDK7后来提供了另一种方式:多抓。
尝试{
//其他代码
} catch(io exception SQLException ex){
扔ex;
}4)、不要忽略异常。空的catch块将使异常无法实现其预期目的,除非,例如,当关闭FileInputStream时,您不必执行任何恢复操作,因为您没有更改文件的状态,并且您已经从文件中读取了所需的信息,因此您不必终止正在进行的操作。
最后要注意几点:
finally中的代码将始终被执行,除非在执行try或catch语句时虚拟机退出(System.exit(1))。
2) finally block可以做一些资源清理,比如关闭文件和游标。
3)最终阻塞是不必要的。
此外,如果return语句在try和finally块中都执行,则最终返回将是finally中的返回值。
2.异常链
经常想在捕捉到异常后再抛出一个,想保存原来的异常信息。这是异常链。在JDK1.4之后,Throwable子类可以接受一个cause对象作为构造函数中的参数来表示原始异常。通过这种方式将原始异常传递给新异常,即使新异常是在当前位置创建并抛出的,也可以通过这个异常链跟踪到异常的原始位置。
但是在Throwable子类中,只有Error、exception和RuntimeException三个异常类为构造函数提供了cause参数,其他类型的异常都需要传递initCause()方法。例如,定义了CustomException类,可以这样使用:
custom exception cmex=new custom exception();
cmex.initCause(新的NullPointerException);
抛cmex这样,CustomException继承自Exception或RuntimeException,后者是一个自定义异常。
一般来说,自定义异常的功能如下:
1)将支票型异常转化为非支票型异常。
2)封装上下文信息,定义异常代码,异常发生时收集环境对象,有利于信息的传递。
异常使用指南
1.只有当你知道如何处理异常时才捕捉它们。
2.用户定义的异常类型用于封装所有检查异常。
3.在程序边界捕捉异常。比如在服务器对应客户端的请求下,出口处的catch里面可能会有异常,打包好的异常统一丢给客户端,以免暴露服务器的敏感信息。
4.仅在异常情况下使用异常。不要习惯性地在所有代码中使用try-catch,因为它会影响性能。
5.抛出一个异常,而不是抽象。如果方法抛出的异常与其执行的任务没有明显的联系,这种情况会让人不知所措。为了避免这个问题,更高级别的实现应该捕捉低级别的异常,并抛出可以根据高级抽象解释的异常。这种做法称为异常转换,如下所示:
尝试{
//使用较低层次的抽象来完成我们的投标
} catch(lowerleveexception ex){
抛出新的HigherLevelException(.);
}另一种特殊的异常翻译叫做异常链,上面已经介绍过了。如果低级异常对于调试导致高级异常的问题非常有帮助,那么使用异常链是合适的。高层异常提供访问方法(Throwable.getCause)来获取低层异常。
6.应该记录每个方法抛出的异常。使用Javadoc的@throws标记来记录抛出每个异常的条件。如果一个方法可能抛出多个异常,不要使用这些异常类的超类。如果不声明一个方法“throws Exception”或者“throws Throwable”,就没有指导。那是java。什么是例外?更多详情请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。