1.错误的分类
编译错误 | 运行错误 | 其他错误 |
也称为语法错误,是 由于编写的程序存在 语法问题,未能通过 源代码到字节码的编 译产生的; | 运行错误是在程序运 行过程中产生的错误 根据性质不同,运行 错误还可以分为语义 错误和逻辑错误; | 其他逻辑错误是指 程序不能实现编程 人员的设计意图和 设计功能需求而产 生的错误 |
每个高级语言都有自 己的语言规范,编译 系统根据这个规范来 定; | 一个没有编译错误的 可执行代码,还有可 能在运行时报错; | 例如人员的年龄不能 为负值、排序时不能 正确处理数组头尾的 元素,图形界面的事 件处理不正确等 |
例如: string a=new string(“abc”); | 语义错误: 1) 程序在语法上正确, 在语义上存在错误。 入数学错误(除数 为0)、输入数据 格式错误、数组下 标越界等等。语义错 误不能被编译系统检 测出来 2) JAVA解释器在运行时 能够发现语义错误,一 旦发现语义错误,JAVA 将停止程序的运行,并 给出错误位置和性质 3) 有些语义错能被程序事先 处理,如除数为0,下标 越界等 | 原因:不符合软件需求 要求、算法考虑不周, 或编码过程中的疏忽 |
逻辑错误: 1)一般逻辑错误是指程序 在执行过程中引发了操作系 统的问题 2)现象:出现死循环,死机 3)一般逻辑通常比较隐蔽, 排除时应根据错误的现象,结 合源程序仔细判断 4)for (int i=5;i>0;) { } //死循环 while (true) //永循环,需要根据 条件有break 5)死循环:应该检测程序的 循环语句和终止条件 6)出现死机:应该检测程序中 的内存分配处理语句 |
---------------------------------------------------------------------------------------------------------------------------------
2.理解异常和异常处理的概念
在程序运行时发生的错位称为异常
在运行时捕获这些异常,并加以处理,称之为"异常处理"
实例:
(1)异常类概念和异常处理机制含义
JAVA类库里预先定义了异常类,每个异常类都代表一种运行错误,
类中包含了该运行错误的方法等内容
异常处理机制含义
程序运行时,一旦系统检测到了不可能执行的操作,会抛出一个异常对象,系统中久一定要有相应的机制去处理它,确保不会产生无法释放资源或内存资源的耗费,这个机制就是异常处理机制
ThreadDeath 线程终止
VirtualMachineError 虚拟机错误
OutOfMemoryError 内存不足错误
StackOverflowError 堆栈溢出错误
EOFException 文件异常结束
FileNotFoundExcetion 文件未找到异常
IllegalArgumentException 非法参数异常
JAVA异常类
异 常 | 说 明 |
Exception | 异常层次结构的根类 |
RuntimeException | 许多 java.lang 异常的基类 |
ArithmeticException | 算术错误情形,如以零作除数 |
ArrayIndexOutOfBoundsException | 索引小于或大于实际的数组大小 |
NullPointerException | 尝试访问 null 对象成员 |
ClassNotFoundException | 不能加载所需的类 |
NumberFormatException | 数字转化格式异常 |
IOException | I/O 异常的根类 |
FileNotFoundException | 找不到文件 |
异常类的层次结构2-1
Throwable 具有两个子类,它们是
Exception:是所有异常类的根,分为派生自RuntimeException类的异常和非派生自RuntimeException类的异常。这时,可以写代码来处理异常并继续程序执行,而不是让程序中断
Error类: 被认为是不能恢复的严重错误,如系统内部错误和资源耗尽错误等。不应该捕获处理这种类型的错误,而是让程序中断
构造器的定义:
Public Exception();
Public Exception(String s); // 带有异常的描述信息的构造器;
主要的三个重要方法:
Public String toString(); //返回描述当前异常信息的字符串。
Public Stirng getMessage() //显示异常错误名称信息
Public void printStackTrace() //无返回值,完成一个打印操作,输出异常对象的堆栈调用顺序。
因为继承关系的特性,任何异常子类对象都会继承上述三个方法。
如果一个异常抛出并没有处理,其实系统会隐式自动地来调用其中的toString()和printStackTrace(),目的是让程序使用者知道发生的错误信息和位置。(对照handled那个例子)并立即中止程序运行,异常位置后面的代码就不再执行了。
--------------------------------------------------------------------------------------------------------------------------------
3、运用 try、catch 和 finally 块处理异常(重点)
Java异常处理机制的代码块
try和catch块
//try和catch块
class ThrowsDemo {
public void calculate(int operand1, int operand2) {
//try{
int result = operand1 / operand2;
System.out.println(result);
//}catch(ArithmeticException ex){
// ex.printStackTrace();
//}
}
}
相关try和catch处理的异常例子
针对上次课所见到的 算术错误 (以零作除数) ArithmeticException 、索引小于或大于实际的数组大小ArrayIndexOutOfBoundsException 、数字转化格式异常NumberFormatException的捕获处理例子。
finally块
try{
// 要监控错误的代码块
methodGeneratingException();
}catch (Exception e) {
// Exception e 的异常处理程序
}finally{
// 在 try 结束前要执行的代码块
cleanup();
}
---------------------------------------------------------------------------------------------------------------------------------
4、运用多重 catch 块处理异常(重点)
多重catch块
一段代码可能会生成多个异常。当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个类型与异常类型匹配的catch语句块
找到匹配的catch块,执行其中的处理语句后,其他的 catch 语句块将被忽略
try{
…….
} catch(ArrayIndexOutOfBoundsException e) {
……
} catch(NumberFormatException e) {
……
} catch(ArithmeticException e) {
……
}
try{
…….
} catch(ArrayIndexOutOfBoundsException e) {
……
} catch(NumberFormatException e) {
……
}
catch(Exception e) {
……
}
使用多重 catch 语句时,异常子类一定要位于异常父类之前
---------------------------------------------------------------------------------------------------------------------------------
5、用户自定义异常
1)概念:使用自定义异常的时候,JavaAPI提供的内置异常不一定总能捕获程序中发生的所有错误。有时会需要创建用户自定义异常,特别是一些逻辑错误 。
自定义异常类必须是Exception类的子类或Exception子类的子类
2)创建用户自定义异常类---必须继承Exception或其子类
class MyException extends Exception {
/** 构造方法。 */
MyException() {
super("您传递的数组大小非法");
}
}
3)检验异常和非检验异常
检验异常是指程序代码中必须要捕获的异常,否则无法通过编译。
检验异常是可以不捕获程序仍可以通过编译的异常
前者:RuntimeException及其子类都属于非检验异常,JVM可以自动捕获,即每个方法的参数后面默认有throws RuntimeException(不用写出来,隐式机制)
后者:其它非继承RuntimeException的异常一般均为检验异常
(例如文件输入输出操作相关的IOException类,和用户自定义异常类)
--------------------------------------------------------------------------------------------------------------------------------
6、运用关键字 throw 和 throws 处理异常(难点)
-------------------------------------------------------------------------------------------------------------------------------
总结:
用户自定义异常必须继承Exception或Exception的子类