null第6章 Java的异常处理机制第6章 Java的异常处理机制主要解决的问题:
1、什么是错误与异常?
2、造成Java异常的有哪些原因?
3、什么是抛出?什么是捕获?
4、Java有哪些异常对象呢?
5、在程序中使用什么语句结构来处理异常呢?
6、能否自己创建异常对象呢? 本章主要
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
本章主要内容1.什么是异常处理机制
2.异常类的层次结构
3.异常的处理6.1 什么是异常处理机制6.1 什么是异常处理机制Java的异常处理机制是用来处理程序运行时的错误的有效机制,以往需要由程序员完成的程序出错情况的判别,在Java中改为由系统承担。通过系统抛出的异常,程序可以很容易地捕获并处理发生的异常情况。
本节的内容主要介绍异常处理机制的基本概念。
6.1.1 什么是错误与异常6.1.1 什么是错误与异常根据错误的性质将运行错误分为两种类型:
1.错误(P108)
2.异常(P108)6.1.2 异常发生的原因6.1.2 异常发生的原因异常发生的原因有以下三种:
1.Java虚拟机检测到了非正常的执行状态。
2.Java程序代码中的throw语句被执行。
3.异步异常发生。6.1.3 如何处理异常6.1.3 如何处理异常 Java提供了异常处理机制来处理异常。分为两个
步骤
新产品开发流程的步骤课题研究的五个步骤成本核算步骤微型课题研究步骤数控铣床操作步骤
:
1.抛出异常
Java是这样规定的:当语义限制被违反时,将会抛出(throw)异常,即产生一个异常事件,生成一个异常对象,并把它提交给运行系统,再由运行系统寻找相应的代码来处理异常。一个异常对象可以由Java虚拟机来产生,也可以由运行的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
生成。异常对象中包含了异常事件类型、程序运行状态等必要信息。
2.捕获异常
异常抛出后,运行时系统从生成异常对象的代码开始,沿方法的调用栈进行查找,直到找到包含相应处理的方法代码,并把异常对象交给该方法为止,这个过程称为捕获(catch)异常。6.2 异常类的层次结构6.2 异常类的层次结构Java中的异常类具有层次结构组织。
如图所示。
6.2.1 Exception异常类的子类6.2.1 Exception异常类的子类(1)RuntimeException运行时异常类
(2)NoSuchMethodException方法未找到异常
(3)java.awt.AWTException图形界面异常类
(4)java.io.TOException输入输出异常类
(5)Exception异常类的其它子类(1)RuntimeException类主要包括以下异常子类:(1)RuntimeException类主要包括以下异常子类:·ArithmeticException 算术异常类;
·ArrayStoreException 数组下标越界异常类;
·ClassCastException 类型强制转换异常类;
·IndexOutOfBoundsException 下标越界异常类;
·NullPointerException 空指针异常类;
·SecurityException 违背安全原则异常类。(2)java.io.TOException类的子类有:(2)java.io.TOException类的子类有:·IOException: 申请I/O操作没有正常完成。
·EOFException:在输入操作正常结束前遇到了文件结束符。
·FileNotFoundException:在文件系统中,没有找到由文件名字符串指定的文件。(3)Exception异常类的其它子类:(3)Exception异常类的其它子类:·EmptyStackException;
·NoSuchFieldException;
·NoSuchMethodException;
·ClassNotFoundException;
·CloneNotSupportedException;
·IllegalAccessException;
·InstantiationException;
·InterruptedException。6.2.2 Error错误类的子类6.2.2 Error错误类的子类 (1)VirtualMachineError 虚拟机错误
OutOfMemoryError 内存溢出错误
StackOverflowError 栈溢出错误
(2)LinkageError 链接错误
(3)NoClassDefNotFoundError类定义未找到错误
(4)java.awt.AWTError 图形界面错误6.3 异常的处理6.3 异常的处理异常处理语句格式为:
try {…} // 被监视的代码段,一旦发生异常,则交由其后的catch代码段处理
catch (异常类型 e) {…} // 要处理的第一种异常
catch (异常类型 e) {…} // 要处理的第二种异常
…
finally {…} // 最终处理例6.1 使用 try…catch语句处理异常的过程。运行结果如图所示: 例6.1 使用 try…catch语句处理异常的过程。运行结果如图所示: nullpublic class TC1 {
public static void main(String[] arg3) {
System.out.println("这是一个异常处理的例子\n");
try {
int i=10;
i /=0;
}
catch (ArithmeticException e) {
System.out.println("异常是:"+e.getMessage());
}
finally {
System.out.println("finally 语句被执行");
}
}
}例6.2 catch语句中声明的异常类型不匹配情况。例6.2 catch语句中声明的异常类型不匹配情况。public class TC2 {
public static void main(String[] args) {
System.out.println(“这是一个异常处理的例子\n”);
try {
int i=10;
i /=0;
}
catch (IndexOutOfBoundsException e) {
System.out.println("异常是:"+e.getMessage());
}
finally {
System.out.println("finally 语句被执行");
}
}
}例6.3 多个catch子句的异常处理。运行结果如图所示。例6.3 多个catch子句的异常处理。运行结果如图所示。nullpublic class TC3 {
public static void main(String[] args) {
try {
int a=args.length;
System.out.println("\na = "+a);
int b=42/a;
int c[]={1};
c[42]=99;
}null catch (ArithmeticException e) {
System.out.println("发生了被 0 除:"+e);
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组下标越界:"+e);
}
}
}6.3.2 throw语句6.3.2 throw语句throw语句格式为:
<异常对象名()>;
程序会在throw语句处立即终止,转向try…catch寻找异常处理方法,不再执行throw后面的语句。下面的例子中使用了throw语句主动抛出一个异常。例6.4 throw语句的使用,运行结果如图所示。例6.4 throw语句的使用,运行结果如图所示。nullpublic class TC5 {
static void throwProcess() {
try {
throw new NullPointerException("空指针异常");
}
catch (NullPointerException e) {
System.out.println("\n在 throwProcess 方法中捕获一个"+e.getMassage());
throw e;
}
}null public static void main(String args[]) {
try {
throwProcess();
}
catch (NullPointerException e) {
System.out.println("再次捕获:"+e);
}
}
}6.3.3 throws子句6.3.3 throws子句throws用来
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
明一个方法中可能抛出的各种异常,并说明该方法会抛出异常但不捕获的异常。如果想明确抛出一个RuntimeException或自定义异常类,就必须在方法的声明语句中用throws子句来表明它的类型,以便通知调用其它方法准备捕获它,这种情况一般需要两个方法来分别处理抛出异常和处理异常。1. 抛出异常交其他地方处理异常1. 抛出异常交其他地方处理异常在抛出异常的方法中要使用throws子句,throws子句的格式为:
<返回值类型> <方法名><([参数])>
< throws> <异常类型> {}下面的例子声明在mathod方法中抛出异常 IllegalAccessException,在调用mathod的main方法里捕获异常。下面的例子声明在mathod方法中抛出异常 IllegalAccessException,在调用mathod的main方法里捕获异常。例6.5 throws语句的使用。运行结果如图所示。
class TC5{
static void mathod() throws IllegalAccessException {
System.out.println("\n在 mathod 中抛出一个异常");
throw new IllegalAccessException();
}
public static void main(String args[]) {
try { mathod(); }
catch (IllegalAccessException e) { System.out.println("在 main 中捕获异常:"+e); }
}
}2. 由方法抛出异常交系统处理2. 由方法抛出异常交系统处理在程序中能够处理的异常,可设计为try-catch-finally语句捕获并处理。对于程序无法处理必须由系统处理的异常,可以使用throws语句在方法中抛出异常交由系统处理。如下面的程序代码,就是将捕获异常交由系统处理。编译将没有问题,但执行程序时,如果该文件在当前目录中不存在,将由系统自动给出异常报告。如:a3.txt系统找不到指定文件。例6.6 throws语句抛出异常交系统处理的例子。 例6.6 throws语句抛出异常交系统处理的例子。 import java.io.*;
public class TC6
{
public static void main (String args[]) throws IOException
{
FileInputStream fis = new FileInputStream("a3.txt");
}
}6.3.4 finally语句6.3.4 finally语句当一个异常被抛出时,程序的执行就不再是连续的了,会跳过某些语句,甚至会由于没有与之匹配的catch子句而过早地返回。为了确保代码的执行,finally子句就是用来标识这样一段代码的。即使没有catch子句,finally语句块也会在执行了try语句块后立即被执行。
从一个方法返回到调用它的另外一个方法,或者是通过return语句,或者是通过一个没有被捕获的异常,但finally子句总是在返回前执行。例6.7 finally子句的使用,运行结果如图所示。例6.7 finally子句的使用,运行结果如图所示。nullclass TC7 {
static void mathodA() {
try {
System.out.println("\nmathodA 抛出一个异常");
throw new RuntimeException();
}
finally {
System.out.println("执行 mathodA 的 finally");
}
}
static void mathodB() {
try {null System.out.println("mathodB 正常返回");
return;
}
finally {
System.out.println("执行 mathodB 的 finally");
}
}
public static void main(String args[]) {
try {
mathodA();
} catch (Exception e) {mathodB();}
}
}6.3.5 编译时对异常情况的检查6.3.5 编译时对异常情况的检查1.可检测类和不可检测类
不可检测的异常类是RuntimeException及其子类、Error及其子类,其他的异常类则是可检测的类。
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
Java API定义了许多异常类,既包括可检测的,也包括不可检测的。由程序定义的异常类也可以包含可检测类和不可检测类。2.可检测异常的处理2.可检测异常的处理在编译时,编译器分析哪些方法会产生可检测的异常,然后检查方法中的可检测异常的处理部分。例如,类Thread的方法sleep定义如下:
public static void sleep (long millis) throws InterruptedException {…}3.不可检测的异常(运行时异常类)3.不可检测的异常(运行时异常类)编译器对不可检测的异常类不进行检查。
因为Java的设计者认为检测这些异常对Java程序的正确性方面帮助不大,而且这种情况发生的原因很多。对每一种情况都进行处理会很麻烦,所以这些异常在编译时不检查。因为这种错误可能发生在程序中的许多地方,恢复起来很困难或者根本不可能恢复。
解释器在执行程序时会对出现异常的程序给出异常报告。6.4 创建自己的异常类6.4 创建自己的异常类自定义异常类型是从Exception类中派生的,所以要使用下面的声明语句来创建:
<自定义异常名> {…}例6.8 创建自定义异常。运行结果如图所示。例6.8 创建自定义异常。运行结果如图所示。nullclass MyException extends Exception {
private int x;
MyException(int a) {x=a;}
public String toString() {return "MyException";}
}
public class TC8 {
static void mathod(int a) throws MyException { // 声明方法会抛出MyException
System.out.println("\t此处引用 mathod ("+a+")");
if (a>10) throw new MyException(a); // 主动抛出MyException
System.out.println("正常返回");
}null public static void main(String args[]) {
try {
System.out.println("\n进入监控区,执行可能发生异常的程序段");
mathod(8);
mathod(20);
mathod(6);
}
catch (MyException e) {
System.out.println("\t程序发生异常并在此处进行处理");
System.out.println("\t发生的异常为:"+e.toString());
}
System.out.println("这里可执行其它代码");
}
}习 题
习 题
1.什么是异常?为什么要进行异常处理?
2. 如何创建一个自定义异常?
3. 如何抛出自定义异常?
4. 下面的程序有何错误?
public class Quiz1 {
public static void main(String args[]) {myMathod();}
myMathod() {throw new MyException();}
}
class MyException {
public String toString() {return "自定义异常";}
}5.下面程序的输出是什么?说出理由。5.下面程序的输出是什么?说出理由。public class Q1 {
public static void main(String args[]) {
try {throw new MyException();}
catch (Exception e) {
System.out.println("It's caught!");
}
finally {
System.out.println("It's finally caught!");}
}
class MyException extends Exception{}
A.It's finally caught! B.It's caught!
C.It's caught! D.无输出
It's finally caught! 6.下面程序中在oneMethod()方法运行正常的情况下将显示什么?说出理由。 6.下面程序中在oneMethod()方法运行正常的情况下将显示什么?说出理由。 public void test() {
try { oneMethod();
System.out.println("情况 1");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("情况2");
} catch(Exception e) {
System.out.println("情况3");
} finally {
System.out.println("finally");
}
}
A. 情况1 B. 情况 2
C. 情况3 D. finally 7.给出下面的不完整的方法: 7.给出下面的不完整的方法: 1)
2) { success = connect();
3) if (success== -1) {
4) throw new TimedOutException();
5) }
6)}
TimedOutException不是一个RuntimeException运行时异常类。下面的哪些声明可以被加入第一行完成此方法的声明,说明理由。
A. public void method()
B. public void method() throws Exception
C. public void method() throws TimedOutException
D. public void method() throw TimedOutException
E. public throw TimedOutException void method()