Java基础学习(三) -- 异常

一、异常概念

   在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。

二、异常体系

Throwable体系:

  1. Error:严重错误Error,无法通过处理的错误,只能事先避免;
  2. Exception:表示异常,异常产生后程序员可以通过代码纠正,使程序继续运行,是必须处理的;

Throwable中的常用方法:

  1. public void printStackTrace():打印异常的详细信息。 包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。
  2. public String getMessage():获取发生异常的原因。提示给用户的时候,就提示错误原因。
  3. public String toString():获取异常的类型和异常描述信息(不用)。

三、异常处理

    Java异常处理关键字:try、catch、finally、throw、throws

3.1 抛出异常Throw

作用:可以使用throw关键字在指定的方法中抛出指定的异常;

使用格式: throw new xxxException("异常产生的原因");

注意事项:

  1. throw 关键字必须写在方法的内部;
  2. throw关键字后边new的对象必须是Exception或者Exception的子类对象;
  3. throw关键字抛出指定的异常对象,我们就必须处理这个异常对象;但throw关键字后边创建的是RuntimeException或者是RuntimeException的子类对象,我们可以不处理,默认交给JVM处理(打印异常对象,中断程序);throw关键字后边创建的是编译异常对象(写代码的时候报错),我们就必须处理这个异常,要么throws,要么try...catch; 

3.2 声明异常throws

throws关键字:异常处理的第一种方式交给别人处理。

作用:当方法内部抛出异常对象的时候,那么我们就必须处理这个异常对象,可以使用throws关键字处理异常对象,会把异常对对象声明抛出给方法的调用者处理(自己不处理,给别人处理),最终交给JVM中断处理;

使用格式: 在方法声明时使用  

修饰符  返回值类型   方法名(参数列表)  throws AAAException,BBBException ... {
    throw new AAAException("产生原因");
    throw new BBBException("产生原因");
    ......
}

注意事项:

  1. throws关键字必须写在方法声明处;
  2. throws关键字后边声明的异常必须是Exception或者是Exception子类;
  3. 方法内部如果抛出了多个异常对象,那么throws后边必须声明多个异常;如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可;
  4. 调用了一个声明抛出异常的方法,我们就必须的处理声明的异常;要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM;要么try ....catch 自己处理异常;
package seventh;

import java.io.FileNotFoundException;
import java.io.IOException;

public class ThrowsDemo {
	
	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String args[]) throws FileNotFoundException,IOException 
	{
		readFile("d:\\a.txt");
	}
	
	/**
	 * @param fileName
	 * @throws IOException 
	 */
	public static void readFile(String fileName) throws FileNotFoundException,IOException
	{
		if(!fileName.equals("c:\\a.txt")) {
			throw new FileNotFoundException("传递的文件路径不是c:\\a.txt");
		}
		
		if(!fileName.endsWith(".txt")) {
			throw new IOException("文件的后缀名不是.txt");
		}
		
		System.out.println("文件路径没有问题");
	}
}

3.3 捕获异常try..catch

try...catch:异常处理的第二种方式,自己处理异常;

使用格式:       

try {
    可能产生的异常的代码;
}catch(定义一个异常的变量,用来接收try中抛出的异常对象){
    异常的处理逻辑,异常对象之后再,怎么处理异常对象;一般在工作中,会把异常信息记录到一个日志中;
}
...
catch(异常类名 变量名) {
    
}

注意事项:

  1. try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象;
  2. 如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try...catch之后的代码,如果try中没有产生异常,那么就不会执行catch中异常的处理逻辑;执行完try中的代码,继续执行try...catch之后的代码;
package seventh;

import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * @author gengpengshuai
 *
 */
public class TryCatchDemo {
	
	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String args[])
	{
		try {
			readFile("d:\\a.txt");
		}catch (IOException e) {
			System.out.println("catch - 传递的文件后缀不是.txt");
		}
		
	}
	
	/**
	 * @param fileName
	 * @throws IOException 
	 */
	public static void readFile(String fileName) throws IOException
	{
		if(!fileName.equals("c:\\a.txt")) {
			throw new FileNotFoundException("传递的文件路径不是c:\\a.txt");
		}
		
		if(!fileName.endsWith(".txt")) {
			throw new IOException("文件的后缀名不是.txt");
		}
		
		System.out.println("文件路径没有问题");
	}
	
}

3.4 finally代码块

有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。

什么时候代码必须最终执行?当我们在try语句块中打开了一些物理资源(磁盘文件/网络连接/数据库连接等),我们都得在使用完之后,最终关闭打开的资源。

finally的预发:try...catch...finally:自身需要处理异常,最终还得关闭资源。

package seventh;

import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * @author gengpengshuai
 *
 */
public class TryCatchDemo {
	
	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String args[])
	{
		try {
			readFile("d:\\a.txt");
		}catch (IOException e) {
			//System.out.println("catch - 传递的文件后缀不是.txt");
			e.printStackTrace();
		}finally {
			System.out.println("资源释放");
		}
		
	}
	
	/**
	 * @param fileName
	 * @throws IOException 
	 */
	public static void readFile(String fileName) throws IOException
	{
		if(!fileName.equals("c:\\a.txt")) {
			throw new FileNotFoundException("传递的文件路径不是c:\\a.txt");
		}
		
		if(!fileName.endsWith(".txt")) {
			throw new IOException("文件的后缀名不是.txt");
		}
		
		System.out.println("文件路径没有问题");
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值