什么是异常
异常就是在程序运行过程中发生了无法继续执行代码的情况
异常就是程序的运行不同于正常情况
谁也不能保证自己写好的程序没有一个异常出现。
什么是异常处理
就是在程序发生异常后的补救措施,就是发生异常后执行的代码
为什么需要异常处理
一旦发生异常,如果不处理,程序就会终止
处理异常后程序就继续运行,保证了程序的健壮性
如何处理异常
使用try-catch语句:
try{
//程序代码
}catch(***Exception e){
//try中出现***Exception的处理代码
}
try-catch异常处理实例
package com.tedu.exception;
/**
* try-catch语句的使用
* Exception类是所有异常类的父类
*
* @author Wildmess
*
*/
public class TryCatchDemo {
public static void main(String[] args) {
System.out.println("程序开始:");
try {
/*
* 在try块中发生的异常会匹配catch块中指定的异常类型
* 如果匹配就进入catch运行
*/
String str = null;
System.out.println(str.length());
System.out.println(str.charAt(1));
} catch (NullPointerException e) {
System.out.println("出现了空指针异常!");
//e.printStackTrace();
//这个方法会输出程序的异常类型
} catch(StringIndexOutOfBoundsException e) {
System.out.println("出现了字符串索引越界异常!");
} catch (Exception e) {
//最后最好写上父类Exception,让没有考虑到的异常全都可以被匹配到,让程序可以正常运行
e.printStackTrace();
}
//可以查看是否运行到此处
System.out.println("程序结束!");
}
}
finally块
finally块是异常处理机制的最后一块,它可以直接跟在try之后或者最后一个catch之后
finally确保程序只要执行到try当中,无论try语句中的代码是否出现错误,finally语句块都会被执行
try{
//程序代码
}catch(***Exception e){
//try中出现***Exception的处理代码
}finally{
//无论try语句中的代码是否出现错误,finally语句块都会被执行
}
或
try{
//程序代码
}finally{
//无论try语句中的代码是否出现错误,finally语句块都会被执行
}
finally实例
基本功能实例
package danei.exception;
public class FinallyDemo1 {
public static void main(String[] args) {
System.out.println("程序开始:");
try {
String str = null;
System.out.println(str.length());
System.out.println(str.charAt(1));
} catch (Exception e) {
System.out.println("出现了异常!");
} finally {
System.out.println("我finally是一定要执行的!");
}
System.out.println("程序结束!");
}
}
利用finally块关闭IO流
由于finally块的特征,我们通常将不关乎出错但必须要执行的代码放在这里,比如释放资源这类操作,如IO中的close
package danei.exception;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* IO程序结合异常机制的编写
*
* @author Wildmess
*
*/
public class FinallyDemo2 {
public static void main(String[] args) {
System.out.println("程序开始:");
FileOutputStream fos = null;
try {
//写一个不存在的文件路径
fos = new FileOutputStream("e://abc.txt");
fos.write(1);
} catch (IOException e) {
System.out.println("出错了!");
} finally {
try {
if(fos!=null) {
fos.close();
}
} catch (IOException e) {
System.out.println("关闭时出错了!");
}
}
System.out.println("程序结束!");
}
}
上述方法中,finally块虽然可以保证对象一定会close,但是代码编写太麻烦了
于是在JDK7之后推出了一个自动关闭对象的变成结构
package com.tedu.exception;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
/**
* JDK1.7之后推出了一个新特性:自动关闭
* @author Wildmess
*
*/
public class FinallyDemo3 {
public static void main(String[] args) {
System.out.println("程序开始:");
/*
* JDK7之后的这个特性允许我们将需要关闭的内容定义在try后面的()当中
* 但是需要注意:只有实现了AutoCloseable接口的类可以在这个定义
* 剩下的还是应当在try语句块中定义,否则会出现编译错误
*
* 该特性是编译器认可,当编译成class文件后,自动的将try()中的资源自动的关闭
* 其实还是在finally中将流关闭
*/
try(
FileOutputStream fos = new FileOutputStream("e:/abc.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos);
) {
osw.write(1);
} catch (Exception e) {
System.out.println("文件不存在!");
}
System.out.println("程序结束!");
}
}