- 异常
- 代码报错先看第一行,圈定范围
- 异常的继承结构
- 异常层次结构中的根是Throwable
- Error:目前我们编码解决不了的问题
- Exception:异常
- 编译异常:未运行代码就报错了,强制要求处理
- 运行时异常:运行代码才报错,可以通过编译,不强制要求处理
- 异常的解决方案
- 1. 捕获处理try-catch–自己解决
- try-catch结构可以嵌套,如果有多种异常类型需要特殊处理的话
- 使用多态的思想,不论是什么子异常,统一看作父类型Exception,做出更加通用的解决方案,甚至可以只写这一个
- try{ 可能会抛出异常的代码 }catch(异常的类型 异常的名字){ 万一捕获到了异常,进行处理的解决方案 }
- 2.向上抛出throws–交给别人解决
- 如果一个方法抛出了异常,那么谁来调用这个方法,谁就需要处理这个异常,这里的处理也有两种方案:捕获解决 或者 继续向上抛出
- 不能直接把异常抛给main(),因为调用main()是JVM,没人解决了,该报错还报错,所以我们一般会在main()调用之前将异常解决掉
- 1. 捕获处理try-catch–自己解决
- 抽象
- 抽象类
- 被abstract修饰的方法是抽象方法,抽象方法没有方法体
- 一旦一个类中有抽象方法,这个类必须被声明成抽象类
- 如果一个子类继承了一个抽象父类,有两种解决方案:
- 1)抽象子类:不实现/实现一部分抽象父类中的抽象方法
- 2)普通子类:实现抽象父类中全部的抽象方法
- 抽象类不能实例化
- 抽象类有构造函数的,但是不是为了自己使用,为了子类super()调用
- 抽象类可以定义成员变量/成员常量
- 抽象类中可以定义全普/全抽/半普半抽
- 如果一个类不想被外界实例化,可以把这个类声明成抽象类
- 抽象方法
- 被关键字abstract 修饰的方法就是抽象方法
- 抽象方法没有方法体{ },直接以分号结束
- 抽象类
- Java异常简介
- Java异常是Java提供的一种识别及响应错误的一致性机制。
- Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。
- 在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪”抛出,异常信息回答了“为什么”会抛出。
- Java异常架构
- Throwable
- Throwable 是 Java 语言中所有错误与异常的超类。
- Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。
- Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。
- Error(错误)
- 定义:Error 类及其子类。程序中无法处理的错误,表示运行应用程序中出现了严重的错误。
- 特点:此类错误一般表示代码运行时 JVM 出现问题。通常有 Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如 OutOfMemoryError:内存不足错误;*Error:栈溢出错误。此类错误发生时,JVM 将终止线程。
- 这些错误是不受检异常,非代码性错误。因此,当此类错误发生时,应用程序不应该去处理此类错误。按照Java惯例,我们是不应该实现任何新的Error子类的!
- Exception(异常)
- 程序本身可以捕获并且可以处理的异常。Exception 这种异常又分为两类:运行时异常和编译时异常。
- 编译时异常
- 定义: Exception 中除 RuntimeException 及其子类之外的异常。
- 特点: Java 编译器会检查它。
- ClassNotFoundException(没有找到指定的类异常),IOException(IO流异常),要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。在程序中,通常不会自定义该类异常,而是直接使用系统提供的异常类。该异常我们必须手动在代码里添加捕获语句来处理该异常。
- 运行时异常
- 定义:RuntimeException 类及其子类,表示 JVM 在运行期间可能出现的异常。
- 特点:Java 编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用try-catch语句捕获它",还是会编译通过。
- NullPointerException空指针异常、ArrayIndexOutBoundException数组下标越界异常、ClassCastException类型转换异常、ArithmeticExecption算术异常。此类异常属于不受检异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。
- RuntimeException 异常会由 Java 虚拟机自动抛出并自动捕获(就算我们没写异常捕获语句运行时也会抛出错误!!),此类异常的出现绝大数情况是代码本身有问题应该从逻辑上去解决并改进代码。
- 编译时异常
- 程序本身可以捕获并且可以处理的异常。Exception 这种异常又分为两类:运行时异常和编译时异常。
- 受检异常与非受检异常
- Java 的所有异常可以分为受检异常(checked exception)和非受检异常(unchecked exception)。
- 受检异常
- 编译器要求必须处理的异常。正确的程序在运行过程中,经常容易出现的、符合预期的异常情况。一旦发生此类异常,就必须采用某种方式进行处理。除 RuntimeException 及其子类外,其他的 Exception 异常都属于受检异常。编译器会检查此类异常,也就是说当编译器检查到应用中的某处可能会此类异常时,将会提示你处理本异常——要么使用try-catch捕获,要么使用方法签名中用 throws 关键字抛出,否则编译不通过。
- 非受检异常
- 编译器不会进行检查并且不要求必须处理的异常,也就说当程序中出现此类异常时,即使我们没有try-catch捕获它,也没有使用throws抛出该异常,编译也会正常通过。该类异常包括运行时异常(RuntimeException极其子类)和错误(Error)。
- 受检异常
- Java 的所有异常可以分为受检异常(checked exception)和非受检异常(unchecked exception)。
- Java异常关键字
- • try – 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
- • catch – 用于捕获异常。catch用来捕获try语句块中发生的异常。
- • finally – finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
- • throw – 用于抛出异常。
- • throws – 用在方法签名中,用于声明该方法可能抛出的异常。
- Java异常处理
- 概述
- Java 通过面向对象的方法进行异常处理,一旦方法抛出异常,系统自动根据该异常对象寻找合适异常处理器(Exception Handler)来处理该异常,把各种不同的异常进行分类,并提供了良好的接口。在 Java 中,每个异常都是一个对象,它是 Throwable 类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。
- Java 的异常处理是通过 5 个关键词来实现的:try、catch、throw、throws 和 finally。
- 在Java应用中,异常的处理机制分为声明异常,抛出异常和捕获异常。
- 声明异常
- 通常,应该捕获那些知道如何处理的异常,将不知道如何处理的异常继续传递下去。传递异常可以在方法签名处使用 throws 关键字声明可能会抛出的异常。
- 非检查异常(Error、RuntimeException 或它们的子类)不可使用 throws 关键字来声明要抛出的异常。
- 一个方法出现编译时异常,就需要 try-catch/ throws 处理,否则会导致编译错误。
- 抛出异常
- 如果你觉得解决不了某些异常问题,且不需要调用者处理,那么你可以抛出异常。
- throw关键字作用是在方法内部抛出一个Throwable类型的异常。任何Java代码都可以通过throw语句抛出异常。
- 捕获异常
- 程序通常在运行之前不报错,但是运行后可能会出现某些未知的错误,但是还不想直接抛出到上一级,那么就需要通过try…catch…的形式进行异常捕获,之后根据不同的异常情况来进行相应的处理。
- 如何选择异常类型
- 常见异常处理方式
- 直接抛出异常
- 通常,应该捕获那些知道如何处理的异常,将不知道如何处理的异常继续传递下去。传递异常可以在方法签名处使用 throws 关键字声明可能会抛出的异常。
- 封装异常再抛出
- 有时我们会从 catch 中抛出一个异常,目的是为了改变异常的类型。多用于在多系统集成时,当某个子系统故障,异常类型可能有多种,可以用统一的异常类型向外暴露,不需暴露太多内部异常细节。
- 捕获异常
- 在一个 try-catch 语句块中可以捕获多个异常类型,并对不同类型的异常做出不同的处理
- 自定义异常
- 习惯上,定义一个异常类应包含两个构造函数,一个无参构造函数和一个带有详细描述信息的构造函数(Throwable 的 toString 方法会打印这些详细信息,调试时很有用)
- try-catch-finally
- 当方法中发生异常,异常处之后的代码不会再执行,如果之前获取了一些本地资源需要释放,则需要在方法正常结束时和 catch 语句中都调用释放本地资源的代码,显得代码比较繁琐,finally 语句可以解决这个问题。
- 读取文件时若发生异常,代码会进入 catch 代码块,之后进入 finally 代码块;若读取文件时未发生异常,则会跳过 catch 代码块直接进入 finally 代码块。所以无论代码中是否发生异常,fianlly 中的代码都会执行。
- 若 catch 代码块中包含 return 语句,finally 中的代码还会执行吗?
- 即使 catch 中包含了 return 语句,finally 子句依然会执行。若 finally 中也包含 return 语句,finally 中的 return 会覆盖前面的 return.
- 直接抛出异常
相关文章
- 08-21flink本地执行报AskTimeoutException异常
- 08-21uniapp打包后提示本应用使用HBuilderX 3.1.12 或对应的cli版本编译,而手机端SDK版本是3.1.13,不匹配的版本可能造成应用异常的解决办法
- 08-21delphi高手突破之异常及错误处理
- 08-21Name or service not known异常处理方法总结
- 08-21VC异常.简单抛,简单捕获
- 08-21使用gevent-socketio和WSGIHandler时,Django:捕获/记录异常
- 08-21BeanShell-java脚本
- 08-21Spring Boot2从入门到实战:统一异常处理
- 08-21【异常】org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=36, exceptions:
- 08-21Selenium常见报错问题解决方案(1)- 先来认识下selenium常见异常类