java异常处理方式
java通过面向对象的方式进行异常处理,一旦方法出现异常,系统自动根据该异常对象寻找合适的异常处理器(Exception Handler)来处理异常,把各种不同的异常进行分类,并提供了良好的接口。
java中,每个异常都是一个对象,它是Throwable类或其他子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。
java的异常处理是通过5个关键词来实现的,throw
、try
、catch
、finally
、throws
案例:
int num1 = 12;
int num2 = 0;
int res = num1/num2;
System.out.println(res);
众所周知,除数是不能为0的,这个在程序也是严格规定的,所以他会出现数学运算异常,导致运行不了
因此程序远认为一端代码可能会出现异常,可以使用try-catch来抛出异常
try {
res = num1/num2;
} catch (Exception e) {
e.printStackTrace();
}
虽然还是会抛出异常,但是还是输出了结果
基本介绍
1、Java语言中,将程序执行中发生的不正常情况称为异常,但是开发过程中的语法错误和逻辑错误不是异常
2、执行过程中所发生的异常事件分为两大类
- Error:java虚拟机无法解决的严重错误,jvm系统内部错误、资源耗尽,比如:栈溢出(StackOverflowError)和OOM,error是严重错误,程序会崩溃
- Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。比如空指针异常,连接超时等
异常处理类型
- 编译异常的特点:编译时就需要捕获该异常,否则报编译错误,称为受检异常
- SQLException:操作数据库时,查询表可能发生异常
- IOException:操作文件时,发生的异常
- FileNotFoundException:当操作一个不存在的文件时,发生异常
- ClassNotException:加载类,该类不存在时,发生异常
- EOFException:操作文件到文件末尾,发生异常
- IllegalArguementException:参数异常
- 运行异常的特点:可以不捕获异常,也不报编译错误,称为非受检异常
Java源程序用javac.exe
编译成字节码文件过程中可能出现编译异常,而运行异常是在字节码文件用java.exe在内存中加载、运行类可能出现的异常就是运行异常,运行时异常,编译器不要求强制处理异常,因为这类异常很普遍,全处理的话会对程序的可读性和运行效率产生影响;编译异常是编译器必须处置的异常
异常处理方式
五个关键字
-
try-catch-finally
try{ //将可能有异常的代码放入 }catch(Exception e){ //捕获到异常 //当异常发生时,系统将异常封装成Exception对象e,传递给catch //得到异常对象后,程序员自己处理 }finally{ //不管异常是否发生,都会执行的操作。一般是释放资源的代码 }
-
try-catch
- 如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch里面
- 如果异常没有发生,则顺序执行try的代码模块,不会进入到catch
- 如果希望异常不论是否发生,都执行某段代码,就使用finally代码模块
-
try-finally
- 这种用法相当于没有捕获异常,因此程序会直接崩掉
- 应用场景执行一段代码,无论是否发生异常,都必须执行某个业务逻辑
throws异常处理
1、如果一个方法可能生成某种异常,但是不能确定如果处理这种异常,则该方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由方法的调用者负责处理,而方法的调用者也可以选择继续处理或者向上抛出
2、在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是他的父类
public void f1() throws FileNotFoundException{
FileInputStream file = new FileInputStream("d://a.text");
//没有这个文件,会抛出异常,直接方法后面throws直接抛出这个异常类型,可以抛出多个或者直接抛出父类Exception
}
注意:
-
对于编译异常,程序中必须处理,比如用try-catch或者throws都可以
-
对于运行异常,程序中没有处理,默认的处理方法就是Throws
-
子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型和父类抛出的异常一致或者父类抛出异常类型的子类型
-
当在方法中调用另一个方法,这个方法会抛出异常,而抛出异常的类型决定是否报错
public static void f1() throws FileNotFoundException{ FileInputStream file = new FileInputStream("d://a.text"); } public static void f2(){ f1(); //会报错 //FileNotFoundException属于编译异常,在执行f2方法时,f1会抛出异常,而f2没有异常的解决方法 }
public static void f1() throws ArithmeticException{ } public static void f2(){ f1(); //不会报错 //因为ArithmeticException属于运行异常,并不要求程序员显示处理,因为运行异常有默认的处理方法Throws }
自定义异常
1、定义:自定义异常类名继承Exception或RuntimeException
2、如果继承Exception,属于编译异常
3、如果继承RuntimeException,属于运行异常
public class CustomException {
public static void main(String[] args) {
int age = 80;
if(!(age>=18 && age <=120)){
throw new AgeException("年龄需要在18—120之间");
}
System.out.println("你的年龄正确!!");
}
}
class AgeException extends RuntimeException{
public AgeException(String message){
super(message);
}
}
throw和throws的区别
1、位置不同
throw:方法内部
throws:方法的签名处
2、内容不同
throw+异常对象,抛出某个异常对象
throws+异常的类型
3、作用不同
throw:异常出现的源头,手动制造异常
throws:在方法的声明处,告诉方法的调用者,这个可能会出现声明的异常。
意义 | 位置 | 后面跟的东西 | |
---|---|---|---|
throws | 异常处理的方式 | 方法声明处 | 异常类型 |
throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |