java中的异常

Posted

tags:

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

Java中的异常 Exception

  java.lang.Exception类是Java中所有异常的直接或间接父类。即Exception类是所有异常的根类。

  例:

public class ExceptionTest
{
      public static void main(String[] args)
      {
             int a = 3;
             int b = 0;
             int c = a / b;          
             System.out.println(c);
      }
}

  编译通过,执行时结果:

  Exception in thread "main" java.lang.ArithmeticException: / by zero

     at com.learnjava.exception.ExceptionTest.main(ExceptionTest.java:9)

  因为除数为0,所以引发了算数异常。

 

  比较常见的异常还有:空指针异常,数组下标越界异常

  java.lang.NullPointerException是空指针异常
    java.lang.IndexOutOfBoundsException是下标越界异常
 
Java中的异常分为两大类:

  1.Checked Exception(非Runtime Exception,编译时异常)

  2.Unchecked Exception(Runtime Exception,运行时异常)

  RuntimeException类是Exception类的子类,是运行时异常。Java中的所有运行时异常都会直接或者间接地继承RuntimeException类。

  Java中凡是继承Exception,但又不继承RuntimeException类的异常都是非运行时异常。
 
异常处理的一般结构

    try
    {
         // 可能发生异常的代码
        // 如果发生了异常,那么异常之后的代码就不会被执行
    }
    catch (Exception e)
    {
        // 异常处理代码
    }
    finally
    {
        // 不管有没有发生异常,finally语句块都会被执行
    }

  比如开始的除法运算代码,加入异常处理之后: 

public class ExceptionTest
{
    public static void main(String[] args)
    {
        int c = 0;
        try
        {
            int a = 3;
            int b = 0;

            c = a / b;// 这块代码出现了异常,那么异常之后的代码都不会被执行
            
            System.out.println("没有发生异常");
        }
        catch (ArithmeticException e)
        {
            e.printStackTrace();
        }
        finally
        {
            //不管有没有发生异常,finally语句块都会被执行
            System.out.println("finally语句!");
        }

        System.out.println(c);
        // 当b为0时,有异常,输出为c的初始值0
    }
}
 

多个catch

  一个try后面可以跟多个catch,但不管多少个,最多只会有一个catch块被执行。
    我们使用多个catch块来捕获异常时,需要将父类型的catch块放到子类型的catch块之后,这样才能保证后续的catch块可能被执行,否则子类型的catch块将永远无法到达,Java编译器会报错。

  如果异常类型是独立的,那么它们的前后顺序没有要求。

 
异常处理方法

  对于非运行时异常(checked exception),必须要对其进行处理,否则无法通过编译。

  处理方式有两种:

  1.使用try..catch..finally进行捕获;

  2.在产生异常的方法声明后面写上throws 某一个Exception类型,如throws Exception,将异常抛出到外面一层去。

对于try..catch..finally:
   try和catch可以连用,try-catch-finally可以连用,但是try,catch,finally却不能单独使用,如果在程序中只想使用try而不想使用catch也可以,但是try的后面必须有finally。

自定义异常

  所谓自定义异常,通常就是定义一个类,去继承Exception类或者它的子类。因为异常必须直接或者间接地继承Exception类。

  通常情况下,会直接继承Exception类,一般不会继承某个运行时的异常类。

  自定义异常举例: 


public class MyException extends Exception
{
    public MyException()
    {
        super();
    }
    public MyException(Exception e){
        super(e);
    }    
    public MyException(String message)
    {
        super(message);
    }
}


 

  注意:try块中有return语句时,仍然会首先执行finally块中的语句,然后方法再返回。

  如果try块中存在System.exit(0);语句,那么就不会执行finally块中的代码,因为System.exit(0)会终止当前运行的Java虚拟机,程序会在虚拟机终止前结束执行。

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

Java中的全局异常处理

Java中的异常处理机制

java中的异常

Java中的异常

Java 中的异常和处理详解

Java中的全局异常处理