异常
异常的含义:
异常就是指不正常,在软件开发中常指程序错误。
在java中经常会出现异常,比如NullPointerException空指针异常,出现异常时如果没有任何处理,则会交由jvm处理,暂停程序并报错,所以在开发过程中都会有对应的异常处理方案。
异常处理:
解决方法1:
通过大量的if判定来确保程序没有异常,但是程序开发最终是要面向用户, 编写的判定逻辑不可能将所有情况都囊括进去,程序在执行过程中如果出现问题,出现异常此时由于没有异常处理方案,会导致jvm暂停程序报错。用户肯定是不能忍受的。同时,通过if判定完成异常校验会使代码臃肿、不利于阅读以及维护。
解决方法2:
通过try catch 内部处理异常,下面是try catch里常用的几种形式
try catch
try{
有可能出现异常的代码块
}catch(异常声明){
异常处理
}
try 多重catch
try{
有可能出现异常的代码块
}catch(异常声明1){
异常处理
}catch(异常声明2){
异常处理
}....{
}catch(异常声明n){
异常处理
}
try catch finally
try{
有可能出现异常的代码块
}catch(异常声明1){
异常处理
}....{
}finally{
代码块(放关闭资源的代码)
}
//finally块的作用就是尽早关闭资源,防止内存的浪费
try catch块执行顺序
先执行try{}里的代码块,如果出现异常,jvm会自动创建一个异常对象,然后去catch块中寻找是否有匹配的异常信息,匹配上之后继续执行catch方法,(从上往下匹配只执行第一个匹配上的catch块,所以不要把父类异常写在前面,否则后面的块永远不会被执行,会出现编译错误),如果没有匹配的catch块会交给jvm,jvm会直接抛出异常中断程序。
注:如果使用了finally,那么一定会执行finally里的代码块,无论是否匹配上ctach块。如果try{}块里面有return语句,会在执行完finally之后再执行。(可以通多System.exit强行退出finally块,不建议)
try-with-resource
finally块需要手动去关闭资源,如果开启的资源很多,那么关闭资源的代码将会很臃肿,所以在jdk1.7之后多了try-with-resource 之后可以使用直接在try后面(开启资源),无需再显式地去在finally里关闭资源。
try(Scanner in = new Scanner(System.in)) {//系统自动关闭资源,无需手动去关闭扫描器
System.out.println("请输入第一个数");
int num1 = in.nextInt();
System.out.println("请输入第二个数");
int num2 = in.nextInt();
System.out.println(num1+"/"+num2+"="+num1/num2);
InputStream stream = new FileInputStream(new File(""));
} catch (InputMismatchException e) {
System.out.println("输入异常");
} catch (ArithmeticException e) {
System.out.println("算数异常");
} catch (FileNotFoundException e) {
System.out.println("io异常");
} catch (Exception e) {
System.out.println("网络异常");
}
解决方法3
通过在方法的参数列表后面throws 异常,对外抛出异常来将异常交给调用者处理,在main方法中使用会直接交给jvm执行。
异常分类
编译时异常(检查时异常)
编译时异常不能通过编译,所以一定要立即处理,只能通过try catch或者 throws向外抛出异常。
运行时异常
运行时异常在编译过程中不会报错,运行时才会报错,可以不立即处理。
throws throw
throw:
1:throw 声明当前代码块中可能存在的异常信息,并且将当前异常信息抛出给调用者。
对于调用者而言,可以通过try-catch捕获异常 ,如果调用者不处理则当前异常交由jvm解决
2:throw会导致当前程序中断掉,后续代码不执行
throws:
1:throws 在方法外对外抛出某个异常,调用者解决当前异常。main方法中对外抛出的异常全部都交由jvm做。
2:throws抛出异常,是异常解决的一种办法定义在方法声明的参数列表后,可以抛出多个异常通过","分割
两者比较:
throw 定义在方法内部,声明当前方法可能出现的异常信息,可以导致当前程序中断。
一般throws和throw会一起使用,throw 声明的异常是检查时异常需要和throws一起使用 。
但是throws可以单独使用,throw单独使用会中断程序。