笔记(十五):异常

什么是异常

异常就是在程序运行过程中发生了无法继续执行代码的情况
异常就是程序的运行不同于正常情况

谁也不能保证自己写好的程序没有一个异常出现。

什么是异常处理

就是在程序发生异常后的补救措施,就是发生异常后执行的代码

为什么需要异常处理

一旦发生异常,如果不处理,程序就会终止
处理异常后程序就继续运行,保证了程序的健壮性

如何处理异常

使用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("程序结束!");
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值