运行期出现的错误,非编译错误,观察错误的名称和行号最重要。
Java异常是Java提供的用于处理程序中错误的一种机制。所谓错误是指程序运行的过程中发生的一些异常事件(如:除0溢出,数组下表越界,所要读取的文件不存在)。
为什么需要处理异常?
当异常发生时,会阻断程序运行,且可能无法获知被阻断的原因或者产生不可预见的结果。设计良好的程序应该在异常发生时提供处理这些错误的方法。
异常处理过程:
定义过程-声明异常:声明该方法有可能抛出的异常,throws 异常类名。
定义过程-抛出异常:设置条件判断,满足条件时,构造并抛出异常对象,throw new 异常类的构造方法。
调用过程-抛出异常(throw):Java程序的执行过程中出现异常事件,可以生成一个异常类对象,该异常类对象封装了异常事件的信息并将被提交给Java运行时系统。
捕获异常(catch):当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理。
异常类:根基类:Throwable,子类:Error,Exception,RuntimeException.
Error:称为错误,由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理。
Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示的声明或捕获。
RuntimeException:一类特殊的异常,如被0除、数组下标越界,其产生比较频繁,处理麻烦,如果显示的声明或捕获将会对程序可读性和运行效率影响很大,因此由系统自动检测并将它们交给缺省的异常处理程序,用户可不必对其处理。
异常的捕获和处理:try{包含可能产生例外的代码}catch(异常类名 变量名){异常处理代码}finally{无论是否发生例外都会被执行},try代码段后跟有一个或者多个catch代码段。如果没有例外产生,则所有的catch代码段都被略过不执行。
异常对象封装了异常事件发生的信息,在catch语句块中可以使用异常对象的一些方法获取这些异常信息。 比如:
getMessage()方法,用来得到有关异常事件的信息。
printStackTrace()方法,用来跟踪异常事件发生时执行堆栈的内容。
finally语句为异常处理提供一个统一的出口,使得在控制流程转到程序的其它部分以前,能够对程序的状态作统一的管理。通常finally语句中可以进行资源的清除工作:关闭打开的文件,删除临时文件,关闭数据库连接。
例如,文件输入流,每次读入一个字符,使用一个int型变量接收,并打印出来。输入文件默认需放在项目根目录下,代码如下:
import java.io.FileInputStream;
import java.io.IOException;
public class TestExceptionCatch {
public static void main(String[] args) {
// TODO Auto-generated method stub
FileInputStream in=null;
try{
in=new FileInputStream("myfile.txt");
int b;
b=in.read();
while(b!=-1){
System.out.print((char)b);
b=in.read();
}
}catch(IOException e){
System.out.println(e.getMessage());
e.printStackTrace();
}finally{
try
{
if (in!=null)
{
in.close();
}
}
catch (IOException e)
{
throw new RuntimeException("关闭失败");
}
}
}
}
原则:
1.如果一个try语句块中,基类异常的捕获语句写在子类异常捕获语句的上面,会报编译错误。即子类异常必须写在基类异常处理之前,当该类异常发生时,由子类来捕获并处理该异常,基类异常不做处理,即基类catch块代码不会被执行。
2.重写方法需要抛出与原方法所抛出异常类型一致的异常或者不抛出异常。