java异常

java异常

一:异常的概念
1.什么是异常
异常指的是程序运行时出现的非正常情况。可能导致程序发生非正常情况的原因有很多,如数组下标越界、算术运算被0除、空指针访问、试图访问不存在的文件等。
2.异常的类层次(常见)
java异常
二:异常的处理结构

  • Java 异常处理通过 5 个关键字 try,catch,finally,throw 和 throws 进行管理
  • Java 中处理异常有两种方式:捕获异常、声明抛出异常。
    捕获异常:就地解决,并使程序继续执行。
    声明抛出异常:就是将异常向外转移,即将异常抛出方法之外,由调用该方法的环境去处理。

捕获异常:

try{
		语句块;
}
catch(异常类名   参变量名)  {  语句块;  }
finally  {  语句块;  }

try: 捕获异常的第一步是用 try{…}选定捕获异常的范围,try 模块中的语句是程序正常流程要执行的语句,但是在执行过程中有可能出现异常。所有可能抛出异常的语句都放入 try 模块中。
catch(必有) :每个 try 代码块可以伴随一个或多个 catch 语句,用于处理 try 代码块中所生成的异常事件。catch 语句只 需要一个形式参数指明它所能够捕获的异常类型,这个类必须是 Throwable 的子类,运行时系统通过参数值把被抛弃的异常对象传递给 catch 块。在 catch 块中是对异常对象进行处理的代码,与访问其它对象一样,可以访问一个异常对象的数据成员或调用它的方法。
catch 语句的顺序: 捕获异常的顺序和 catch 语句的顺序有关,当捕获到一个异常时,剩下的 catch 语句就 不再进行匹配。因此, 在安排 catch 语句的顺序时,首先应该捕获最特殊的异常,然后 再逐渐一般化。也就是一般先安排子类,再安排父 类。
finally(可选) :捕获异常的最后一步是通过 finally 语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分 以前,能够对程序的状态作统一的管理。不论在 try 代码块中是否发生了异常事件,finally 块中的语句都会被执行。

抛出异常:

  • 在 Java 程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。生成的异常对象将传递给 Java运行时系统,这一异常的产生和提交过程称为抛出(throw)异常。

声明抛出异常
一个方法不处理它产生的异常,而是沿着调用层次向上传递,由调用它的方法来处理这些异常,叫声明抛出异常(throws)。声明抛出异常是一种消极的异常处理机制
抛出异常就是产生异常对象的过程,首先要生成异常对象,异常或者由虚拟机生成,或者由某些类的实例 生成,也可以在程序中生成。在方法中,抛出异常对象是通过 throw 语句实现的。
例如:

 IOException  e = new IOException();
 throw e; 

注意

  • 可以抛出的异常必须是 Throwable 或其子类的实例。
  • throws 子句中同时可以指明多个异常,之间由逗号隔开。
  • 对 Error 类或其子类的对象,程序中不必进行处理。
  • 对 RuntimeException 类或其子类,程序中可以不必进行处理。
  • 除此之外的异常,程序员都应该在程序中进行处理。
    处理方式分为以下几种:
    ① 要么用 try-catch-finally 进行捕获处理
    ② 要么明确表示不处理从而声明抛出异常
    ③ 要么先捕获处理然后再次抛出。
    在进行异常处理过程中应该注意
    Java 的异常处理机制(try-catch-finally 语句、throws 子句、throw 语句)会带来 Java 程序代码结构上的改变。
    ① 不能滥用异常机制。简单的出错判断建议用 if 语句。
    ② 不要过分细分异常。

三.自定义异常

1.自定义异常类设计
在程序中,可以创建自定义的异常类。用户定义的异常必须继承自 Throwable 或 Exception 类,建议用 Exception 类。
2.抛出异常
例如:

//自定义异常类
class MyException extends Exception{
	String id;//异常标识
	public MyException(String str){
		id=str;
	}
	public String toString(){
		return ("异常:"+id);
	}
}

public class TestDemo {

	public static void main(String[] args) {
		try{
			throw new MyException("一个测试异常!");
		}catch(MyException e){
			System.out.println(e);
		}
	}
}

运行结果:

异常:一个测试异常!

3.方法的异常声明

修饰符   返回类型   方法名(参数列表) throws  异常类名列表{
	...
	throw  异常类名;
	...
}