Java异常可分为3种:
(1)编译时异常:Java.lang.Exception
(2)运行期异常:Java.lang.RuntimeException
(3)错误:Java.lang.Error
其中:Java.lang.Exception和Java.lang.Error继承自Java.lang.Throwable;Java.lang.RuntimeException继承自Java.lang.Exception.
对于编译时异常:由编译器在编译时检测是否会发生在方法的执行过程中的异常。对于编译时的异常类,即使通过仔细编程也无法避免。因为程序正确,但因为外在的环境条件不满足引发。例如,要访问的文件不存在、用户错误及I/O问题等情况。这类异常通常都在JDK说明文档中定义的方法后面通过throws关键字将异常抛出,Java编译器强制要求处理这类异常,编程时必须捕获并做相应处理,如果不捕获这类异常,程序将不能被编译通过。我们经常遇到的一个编译时异常就是IOException,示例如下:
import java.io.*;
class FileWriterDemo2
{
public static void main(String[] args)
{
FileWriter fw = null;
try
{
fw = new FileWriter("z:\\Demo.txt"); //注意这里的盘符是z,一般情况下不可能出现z盘,是不是产生异常啊?这是由于外部条件不满足,而代码本身没错误,会抛出FileNotFoundException,这是IOException的子类
fw.write("ablcdafd");//如果fw为空,这里就无法调用write方法,也会抛出异常。造成的原因都跟外部条件有关
}
catch(IOException e)
{
System.out.println(e.toString());
}
finally
{
try{}//close方法也需要抛出异常
{
fw.close(); //如果fw为空,这里就无法调用close方法,也会抛出异常。造成的原因也跟外部条件有关
}
catch(IOException e)
{
System.out.println(e.toString());
}
}
}
}
以上代码在编译就会产生异常,编译不会成功。
运行时异常: Java运行系统执行过程中的异常,对于此类的异常,不需要声明异常,即使不编写异常处理的程序代码,依然可以编译成功,因为该异常是在程序运行时才有可能发生的,例如算术异常(除数为0)、数组下标越界等。这类异常需要更改程序来避免,Java编译器强制要求程序停止运行处理这类异常。此类异常适合用于异常发生时不处理让程序停止,进行代码修正。我们经常遇到的运行时异常就是数组越界异常IndexOutOfBoundsException,示例如下:
import java.util.*;
class Easy
{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.print("请输入源程序:");
String temps = sc.nextLine();
System.out.println();
String[] arrays = temps.split(" ");
for (int i = 0; i < temps.length(); i ++)//这里的temps应该改为arrays,是程序员设计上的错误,只有在执行程序的时候才会被发现,运行时会抛出IndexOutOfBoundsException异常
{
if(arrays.equals("begin"))
System.out.print("(1,begin)");
else
System.out.print("(error)");
}
}
}
以上代码没有语法等错误,编译的时候是成功的,运行时才会出现异常,程序会停止运行。
|