常见异常
Java 程序的执行过程中如出现异常会生成一个异常类对象该异常对象将被提交给 Java 运行时系统这个过程称为抛出(throw)异常。
异常对象的生成
- 由虚拟机 自动生成 :程序运行过程中,虚拟机检测到程序发生了问题,如果在当前代码中没有找到相应的处理程序,就会在后台自动创建一个对应异常类的实例对象并抛出自动抛出
- 由开发人员 手动创建 Exception exception = new ClassCastException(); 创建好的异常对象不抛出对程序没有任何影响,和创建一个普通对象 一样
异常处理机制一:try-catch-finally
try{
...... //可能产生异常的代码
}
// 如果明确知道产生的是何种异常,可以用该异常类作为 catch 的参数;也可以用其父类作为 catch 的参数。
catch( ExceptionName1 e)
...... //当产生 ExceptionName 1 型异常时的处置措施
}
catch( ExceptionName2 e)
...... //当产生 ExceptionName 2 型异常时的处置措施
}
finally{// 可选
...... //无论是否发生异常 都无条件执行的语句
}
- final 是可选的;不论在 try 代码块中是否发生了异常事件, catch 语句是否执行, catch 语句是否有异常, try / catch 语句中是否有 return, finally 块中的语句都会被执行。
- 像输入输出流、数据库连接、网络编程Socket等资源、JVM是不能自动回收的,需要手动释放资源,这时需要放到finally。
- catch中的异常类型:子类异常必在父类异常之上,否则报错。
- getMessage() 获取异常信息,返回字符串
- printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值 void 。
- try中声明的变量,出了try结构后,就不能被调用
异常处理机制二:throws
如果一个方法 中的语句执行时,可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理而由该方法的调用者负责处理 。
在方法声明中用 throws 语句可以声明抛出异常的列表,throws 后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。(throws后可以跟多个异常,逗号隔开)
异常后续的代码,不会再执行。
public void readFile (String file) throws FileNotFoundException{
……
//读文件的操作可能产生 FileNotFoundException 类型的异常
FileInputStream fis new FileInputStream (file);
……
}
重写方法不能抛出比被重写方法范围更大的异常类型 。 在多态的情况下,对 method()A 方法的调用-异常的捕获按父类声明的异常处理 。
public class A {
public void methodA () throws IOException
……
} }
public class B1 extends A {
public void methodA () throws FileNotFoundException
……
} }
public class B2 extends A {
public void methodA () throws Exception { //报错
……
} }
两种机制的选择:
- 父类被重写的方法没有throws抛出异常,则子类重写的方法也不能使用throws,如果子类重写的方法中有异常,必须使用try-catch-finally结构
- 执行的方法a中,先后调用了递进关系的另外几个方法,建议这几个方法用throws的方式处理,方法a考虑使用try-catch-finally方式处理
手动跑抛出异常-throw
Java 异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出也可根据需要使用人工创建并抛出 。
首先要生成异常类对象 然后通过 throw 语句实现抛出操作 提交给 Java 运行环境 。
IOException e = new IOException();throw e;
可以抛出的异常必须是 Throwable 或其子类的实例 。 下面的语句在编译时将会产生语法错误:
throw new String(“want to throw”);
用户自定义异常类
- 用户自定义的异常类必须继承现有的异常类。
- 一般地,用户自定义异常类都是 RuntimeException 的子类。
- 自定义异常类通常需要编写几个重载的构造器 。
- 自定义异常需要提供 serialVersionUID,声明为全局常量:static final long serialVersionUID=XXXL;
- 自定义的异常通过 throw 抛出 。
- 自定义异常最重要的是异常类的名字,当异常出现时,可以根据名字判断异常类型。