java中的 常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。在API可以看到Exception中,有很多已知的子类,比较常见的有:ApplicationException, AWTException,DataFormatException, ClassNotFoundException,RuntimeException,SQLException, RuntimeException...... 等等,很多.
其中RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。
RuntimeException是可以有异常但是不需要抛出或者捕捉、包括它的任何子类都无需去捕捉。例如我们比较常见的IndexOutOfBoundsException, NullPointerException,....等等。
下面通过FileReader和FileWriter实现文件的复制功能,并实现处理运行中出现的异常。。
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class JavaException {
/**
* Java的IO异常处理
*/
public static void main(String[] args) {
//为什么在try外面写,是因为在finally里面要使用,否则是访问不到的
FileWriter fileWriter=null;
FileReader fileReader=null;
try {
//创建一个写文件对象,如果文件不存在的话,他会自己创建一个文件,如果文件已经存在则会被覆盖
fileWriter=new FileWriter("D:\\java.txt");
//这里的目录路径出现两个反斜杠是因为在字符串中,的反斜杠需要转义的转义之后才是反斜杠
fileReader=new FileReader("D:\\eclipse\\workspace\\Demo\\src\\test.java");
//顶一个字符数组,因为FileReader是一个处理字符的流的对象
char[] buffer=new char[1024];
int len=0;
//把数据读取到char数组中,因为filereader读取到结尾时,返回值为-1;所以用while循环作为条件
while((len=fileReader.read(buffer))!=-1)
{
//把数据从字符数组的开始到结束位写入到D:\\java.txt的文件中
fileWriter.write(buffer, 0, len);
}
} catch (IOException e) {
//在控制台输出捕获到的异常
System.out.println(e.toString());
}
finally
{
/**
* 最后在finally里面关闭流,释放资源
*/
/*
* 这里为什么要判断他是否为空,因为如在try中发生异常,fileReader对象是null的,在这里如果不判断,
*直接关闭流的话,可能出现空指针异常
*/
if(fileReader!=null)
{
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fileWriter!=null)
{
try {
fileWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}