什么是异常?
异常是程序在运行或编译时,任何中断正常程序流程的错误,主要是语法错误和语义错误。但错误和异常是不同的,错误它指的是一个合理的应用程序不能截获的严重的问题,是很难解决的。在Java中异常Exception和错误Error有个共同的父类Throwable。
异常的分类
java中的异常可分为两类:运行时异常和编译时异常。
运行时异常是RuntineException类及其子类,当出现这种错误时,编译器是不会去检查它的。
编译时异常是除了RuntineException类及其子类外的其他Exception类及其子类,当出现这种错误时,编译器会检查它,这种异常的特点是要么用try...catch捕获处理,要么用throws语句声明抛出,否则编译不会通过。
异常处理机制
Java异常处理是通过5个关键字来处理的。它们是try、catch、throw、throws和finally。其中try、catch要一起使用,不能单独使用。
运行时异常的处理方法
对于这类异常,我们不需要异常处理的关键字来处理,而是在程序编写时,尽量去避免这种异常,一旦发现该异常,正确的做法就是改进程序设计的代码和实现方式,修改程序中的错误,从而避免这种异常。
编译时异常的处理方法
1.使用try、catch、finally
用try来捕获可能出现的异常的语句,catch是出现异常时的处理方法。在程序中使用的格式为:
try
{
可能发生异常的代码块;
}
catch(异常类型异常对象名)
{
异常处理代码块;
}
......
......
catch(异常类型异常对象名)
{
异常处理代码块;
}//可有可无
finally{
//不管是否出现异常,都将执行finally中的语句
}
当我们在使用这三个关键字时要注意以下几点:
第一、try语句不能单独存在,可以和catch、finally组成 try...catch...finally、try...catch、try...finally三种结构,catch语句可以有一个或多个,finally语句最多一个,try、catch、finally这三个关键字均不能单独使用。
第二、try、catch、finally三个代码块中变量的作用域分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。
第三、多个catch块时候,Java虚拟机会匹配其中一个异常类或其子类,就执行这个catch块,而不会再执行别的catch块。
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array = new int[]{1,2,3,4};
try
{
System.out.println(array[4]);
}
catch (NullPointerException e)
{
System.out.println(e.toString());
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println(e.getMessage()); e.printStackTrace();
}
finally
{
System.out.println("出现异常!");
}
}
运行结果:
4
java.lang.ArrayIndexOutOfBoundsException: 4
at cn.netjava.lesson11.MyTest.main(MyTest.java:12)
出现异常!
2.使用throws ,throw
用throws将异常抛出,将异常交给Java虚拟机做,程序员不在需要自己对异常进行处理。使用格式为:throws 异常类型1,异常类型2......
throw可用来自定义一个异常对象。 使用格式为:throw 异常对象
public static void main(String[] args) throws Exception
{
MyTest mt = new MyTest();
mt.creatfile() ;
}
public void creatfile() throws Exception{
String str = "文件abc.txt";
File file = new File(str);
if (file.exists()) {
long length = file.length();
System.out.println("文件的长度是:" + length);
} else {
// 创建文件
file.createNewFile();
long length = file.length();
System.out.println("文件创建成功!");
System.out.println("文件的长度是:" + length+"byte");
}
}
运行的结果:
文件创建成功!
文件的长度是:0byte
自定义异常
public class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
public static void main(String[] args) throws MyException {
int i = 1 ;
if(i == 0){
throw new MyException("出现异常");
}else {
i-- ;
}
}
用throws声明方法可能抛出自定义的异常,并用throw语句在适当的地方抛出自定义的异常。
throw语句后不允许有紧跟其他语句,因为这些没有机会执行。