java异常处理

Posted 爽走不解释

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java异常处理相关的知识,希望对你有一定的参考价值。

java异常简介

程序运行过程中出现不可以预料的错误和bug,导致程序中止或产生了错误的结果,这个现象就叫异常

一、为什么要有异常处理机制?
Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪”抛出,异常信息回答了“为什么”会抛出。

异常体系图

如图可以看出所有的异常跟错误都继承与Throwable类,也就是说所有的异常都是一个对象。

从大体来分异常为两块:
1、error—错误 : 是指程序无法处理的错误,表示应用程序运行时出现的重大错误。例如jvm运行时出现的OutOfMemoryError以及Socket编程时出现的端口占用等程序无法处理的错误。

2、Exception — 异常 :异常可分为运行时异常跟编译异常

1)运行时异常:即RuntimeException及其之类的异常。这类异常在代码编写的时候不会被编译器所检测出来,是可以不需要被捕获,但是程序员也可以根据需要进行捕获抛出。常见的RUNtimeException有:NullpointException(空指针异常),ClassCastException(类型转换异常),IndexOutOfBoundsException(数组越界异常)等。
2)编译异常:RuntimeException以外的异常。这类异常在编译时编译器会提示需要捕获,如果不进行捕获则编译错误。常见编译异常有:IOException(流传输异常),SQLException(数据库操作异常)等。

java处理异常的机制:抛出异常以及捕获异常 ,一个方法所能捕捉的异常,一定是Java代码在某处所抛出的异常。简单地说,异常总是先被抛出,后被捕捉的。

二、接下来看一下异常的捕获:

(1) try-catch

A:捕获单个异常

 try
      //程序代码
  catch (ExceptionName e1)
      //Catch块
  

B:多重捕获块

try
      //程序代码
  catch (异常类型1 异常的变量名1)
      ......
  catch (异常类型2 异常的变量名2)
      ......
  catch (异常类型3 异常的变量名3)
      ......
  

try:用于监听异常
catch:用于捕获处理异常
try后面的一对大括号内的内容即受到监控的程序,也就是说这一段代码是可能存在异常的,而Catch中由开发者,根据自身推断可能存在的异常,书写对应异常类型以及处理方式,当程序发生异常时,会创建异常对象,并且将异常抛出到此环境外,Java运行时系统会寻找与发生异常所匹配的catch子句,当找到一个对应语句后则不再寻找其他catch块

示例:

  public class Demo 
      public static void main(String[] args) 
          int a = 520;
          int b = 0;
          int c;
  ​
          try 
              System.out.println("这是一个被除数为0的式子");
              c = a / b;
           catch (ArithmeticException e) 
              System.out.println("除数不能为0");
          
      
  
  
  //运行结果
  这是一个被除数为0的式子
  除数不能为0

(2) try-catch-finally

finally 关键字用来创建在 try 代码块后面执行的代码块无论是否发生异常,finally 代码块中的代码总会被执行,在 finally 代码块中,可以运行清理类型等收尾善后性质的语句,finally 代码块出现在 catch 代码块最后,语法如下:

  try
      ......
  catch(异常类型1 异常的变量名1)
      ......
  catch(异常类型2 异常的变量名2)
      ......
  finally
      ......
  

无论是否发生异常,fianlly始终都是会运行的

这里就不得不提一个非常重要的注意点,那就是当return遇到finally!
在catch里面有一个return,那么finally会不会被执行呢?

看代码

try
    //待捕获代码
catch(Exception e)
    System.out.println("catch is begin");
    return 1finally
     System.out.println("finally is begin");


======
输出结果:
catch is begin
finally is begin  

也就是说会先执行catch里面的代码后执行finally里面的代码最后才return1 ;

再看代码:

try
   //待捕获代码    
catch(Exception e)
    System.out.println("catch is begin");
    return 1finally
     System.out.println("finally is begin");
     return 2 ;

这次代码中输出结果跟上面是一样的,然而返回的是return 2 ; 原因很明显,就是执行了finally后已经return了,所以catch里面的return不会被执行到。也就是说finally永远都会在catch的return前被执行。(这个是面试经常问到的问题哦!)

注意1、
对于异常的捕获不应该觉得方便而将几个异常合成一个Exception进行捕获,比如有IO的异常跟SQL的异常,这样完全不同的两个异常应该分开处理!而且在catch里处理异常的时候不要简单的e.printStackTrace(),而是应该进行详细的处理。比如进行console打印详情或者进行日志记录。
注意2、
异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。

(3) throw/throws
将自己处理不了的,在方法或者语句上声明,告诉调用者,这里有问题

如果一个方法没有捕获到检查性异常,那么该方法就必须使用throws关键字声明(声明抛出多个异常,之间使用逗号隔开),也可以在语句中使用throw关键字抛出一个异常。

public void test() throws Exception 
    throw new Exception();

从上面这一段代码可以明显的看出两者的区别。throws表示一个方法声明可能抛出一个异常,throw表示此处抛出一个已定义的异常(可以是自定义需继承Exception,也可以是java自己给出的异常类)。

throw跟throws的区别:

A:throws

用在方法声明后,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,不一定会发生这些异常
B:throw

用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
执行throw则一定抛出了某种异常

三、自定义异常

Java内置的异常类,基本可以满足我们在编程中遇到的大部分异常情况,此外我们还可以自定义异常类,只需要继承Exception类即可

基本步骤:

  • 创建自定义异常类
  • 在方法中通过throw抛出异常对象
  • 在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获处理
    也可以在方法声明处使用throws将异常抛给方法调用者
  • 在出现异常方法的调用者中捕获并且处理异常
 class MyException extends Exception   // 自定义的类
      MyException(String s) 
          super(s);
      
  
  class Demo 
      void method() throws MyException 
          throw new MyException("Wrong"); // 抛出自定义的类
      
  
  class DemoTest 
      public static void main(String[] args)
          try 
              new Demo().method();
          
          catch(MyException e) 
              System.out.println(e.getMessage());
          
       
  //运行结果
  Wrong

总结一波

异常就是在程序发生异常时,强制终止程序运行,并且将异常信息返回,由开发者决定是否处理异常 简单说一下这个异常机制的过程:

当程序无法运行后,它会从当前环境中跳出,并且抛出异常,之后,它会先new一个异常对象,然后在异常位置终止程序,并且将异常对象的引用从当前环境中返回,这时候异常处理机制接管程序,并且开始寻找可以继续执行程序的恰当位置

欢迎留言评论

以上是关于java异常处理的主要内容,如果未能解决你的问题,请参考以下文章

异常 异常处理

Java异常处理

Java 异常处理

Java异常处理

java异常处理

Java 异常处理