编译时期异常方法 | 说明 |
IOException | 当发生某种I/O异常时,抛出此异常 |
SQLException | 提供关于数据库访问错误或其他错误信息的异常 |
ClassNotFoundException | 类没有找到异常 |
NoSuchFieldException | 类不包含指定名称的字段时产生的信号 |
NoSuchMethodException | 无法找到某一特定方法时,抛出该异常 |
运行时期异常方法 | 说明 |
IndexOutOfBoundsException | 指示某集合或数组的索引值超出范围时抛出该异常 |
NullPointerException | 当应用程序试图在需要对象的地方使用null时,抛出该异常 |
AritmeticException | 当出现异常的运算条件时,抛出此异常 |
IllegalArgumentException | 抛出的异常表明向方法传递了一个不合法或不正确的参数 |
ClassCastException | 当试图将对象强制转换为不是实例的子类时,抛出该异常 |
捕获异常:
1.try……catch……finally(标准格式) 捕获异常
2.throws 抛出异常
捕获异常的变形格式:
a、try……catch
b、try……catch……catch
c、try……finally……
一般格式:
try{
//可能会出现问题的代码
}catch(异常类名 变量名){
//输出语句处理
}
如果有多个异常存在如何处理:
a、针对多个异常分别try……catch……(较麻烦实际开发中不使用)
/**
*
*/
package org.zst.Exception;
/**
* @author:zsyht
* @date:2017-11-22上午11:32:37
*/
public class Test1 {
public static void main(String[] args) {
int a = 10;
int b =0;
int[] arr={1,2,3};
try{
System.out.println(a/b);
}catch(ArithmeticException e){
System.out.println("被除数不能为0!");
}
try{
System.out.println(arr[3]);
}catch(IndexOutOfBoundsException e){
System.out.println("您访问的元素越界!");
}
}
}
b、try{
//可能会出现问题的语句
}catch(异常类名1 变量名){
……
}catch(异常类名2 变量名){
……
}
多个异常一块处理,只要try语句中的代码和catch语句中的代码所描述的异常类信息一致,那么直接走catch语句里的代码,try……catch语句结束。
/**
*
*/
package org.zst.Exception;
/**
* @author:zsyht
* @date:2017-11-22上午11:32:37
*/
public class Test1 {
public static void main(String[] args) {
int a = 10;
int b =0;
int[] arr={1,2,3};
try{
System.out.println(a/b);
System.out.println(arr[3]);
}catch(ArithmeticException e){
System.out.println("被除数不能为0!");
}catch(IndexOutOfBoundsException e){
System.out.println("您访问的元素越界!");
}
}
}
JDK1.7给出异常处理的新方式:
try{
//可能出现问题的代码
//……
}catch(异常类名1 | 异常类名2 变量名){
//异常处理
}
注意事项:
a、多个异常类名之间必须时平级关系
b、这种格式在实际开发中虽然有多个异常,但针对具体异常给出具体异常
/**
*
*/
package org.zst.Exception;
/**
* @author:zsyht
* @date:2017-11-22上午11:32:37
*/
public class Test1 {
public static void main(String[] args) {
int a = 10;
int b =0;
int[] arr={1,2,3};
try{
System.out.println(a/b);
System.out.println(arr[3]);
}catch(ArithmeticException |IndexOutOfBoundsException e){
System.out.println("被除数不能为0!");
System.out.println("您访问的元素越界!");
}
}
}
标准格式:
try{
//需要执行的语句
}catch(异常类名 变量名){
//异常处理
}fianlly{
//一定会被处理的语句
}
在异常处理时,应该尽量使用finally块进行资源回收,因为在try……catch……finally语句块中,不管程序是否发生异常,最终都会执行fianlly语句块,因此可以在finally块中添加释放资源的代码。
finally中的代码不执行只有一种情况,JVM退出,System.exit(0)。
抛出异常:
1.throws通常用于方法声明,当方法中可能存在异常,却不想在方法中对异常进行处理时,就可以在方法声明时使用throws声明抛出的异常,然后再调用该方法的其他方法中对异常进行处理。如需使用throws声明抛出多个异常,各个异常之间要用逗号隔开。
格式:
数据类型 方法名(形参列表) throws 异常类1,异常类2,……,异常类n{
方法体
}
2.throw语句通常是在方法中,在程序中自行抛出异常,使用throw语句抛出的是异常的实例,通常与if语句一起使用。
格式:
throw new Exception("对异常的说明")
面试题:throw和throws的区别?
throws可以抛出多个异常,中间用","隔开,在方法声明上抛出,表示异常的一种可能行,后面跟异常类名,表示抛出异常的一种可能性。
throw也表示抛出,后常跟匿名对象,只能跟具体的一个异常对象,在方法语句中抛出,表示异常的绝对性,有方法中的某些语句处理。
实际开发中throws比throw用的多,捕获异常比抛出异常用的多。
实际开发中有时需要自定义一个异常类,继承自Exception或RuntimeException
注意事项:
1.子类在重写父类中方法的时候,如果父类中方法抛出异常,那么子类重写这个方法抛出异常就不能比父类中该方法的异常大。
2.子类继承父类,重写父类中的方法的时候,如果本身父类中该方法没有异常,那么子类中重写该方法的时候不能抛出异常,只能捕获异常。
/**
*
*/
package org.zst.Exception;
/**
* @author:zsyht
* @date:2017-11-22下午12:59:17
*/
public class NewException extends Exception{
public NewException(Double r){
System.out.println("发生异常:圆的半径不能小于20");
System.out.println("圆的半径:"+r);
}
}
/**
*
*/
package org.zst.Exception;
/**
* @author:zsyht
* @date:2017-11-22下午1:24:26
*/
public class Example {
public static void showArea(double r)throws NewException{
if(r<=20){
throw new NewException(r);
}
double area=3.14*r*r;
System.out.println("圆的面积是:"+area);
}
public static void main(String[] args) {
try{
showArea(10);
}catch(NewException e){
System.out.println(e);
}
}
}
获取异常信息的方法:
try里面的代码一但出现问题,jvm就会针对这个问题抛出一个异常,然后和catch里所描述的异常进行是否匹配,如果一致就会产生一个异常对象,处理这个异常对象就会调用一些方法。
方法 | 说明 |
String getLocalizedMessage() | 获得此Throwable的本地化描述 |
String getMessage() | 获得此Throwable的详细消息字符串 |
void printStackTrace() | 将此Throwable及其栈踪迹输出至标准错误流 |
String toString | 获得此Throwable的简短描述 |
/**
*
*/
package org.zst.Exception;
/**
* @author:zsyht
* @date:2017-11-22下午1:47:09
*/
public class Test2 {
public void method(){
try{
int a = 10;
int b = 0;
int z = a/b;
System.out.println(z);
}catch(ArithmeticException e){
e.printStackTrace();
System.out.println("调用getMessage: "+e.getMessage());
System.out.println("调用getLocalizedMessage: "+e.getLocalizedMessage());
System.out.println("调用toString: "+e.toString());
}
}
public static void main(String[] args) {
Test2 a = new Test2();
a.method();
}
}
异常类的使用原则:
a、不要过多的使用异常,这样会增加系统的负担
b、在方法中使用try……catch语句块捕获异常时,要对异常作处理
c、try……catch语句块的范围不要太大,这样不利于对异常做分析
d、一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或子异常