Java基础-异常

Posted sunnivazhang

tags:

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

技术图片

异常都是继承自Throwable类。

非检查异常unchecked exception:runtimeexception和error。javac在编译时,不会提示和发现这样的异常,不要求在程序处理这些异常。所以如果愿意,我们可以编写代码处理(使用try…catch…finally)这样的异常,也可以不处理。对于这些异常,我们应该修正代码,而不是去通过异常处理器处理 。这样的异常发生的原因多半是代码写的有问题。如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等。

检查异常checked exception:其他异常。javac强制要求程序员为这样的异常做预备处理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样的异常一般是由程序的运行环境导致的。如SQLException , IOException,ClassNotFoundException 等。

  处理方法:方法用throws抛出异常

 

注意事项:

当子类重写父类的带有 throws声明的函数时,其throws声明的异常必须在父类异常的可控范围内——用于处理父类的throws方法的异常处理器,必须也适用于子类的这个带throws方法 。这是为了支持多态。

例如,父类方法throws 的是2个异常,子类就不能throws 3个及以上的异常。父类throws IOException,子类就必须throws IOException或者IOException的子类。

 

在 try块中即便有return,break,continue等改变执行流的语句,finally也会执行。

finally中的return 会覆盖 try 或者catch中的返回值。

              public static void main(String[] args)

     {    int result;
        result = foo();
        System.out.println(result);     /////////2
        result = bar();
        System.out.println(result);    /////////2
    }
    public static int foo()
     {   try{
            int a = 5 / 0;
        } catch (Exception e){
            return 1;
        } finally{
            return 2;
        }
    }
    public static int bar()
    {  try {
            return 1;
        }finally {
            return 2;
        }
    }
finally中的return会抑制(消灭)前面try或者catch块中的异常
     publicstaticvoidmain(String[] args)
    {
        int result;
        try{
            result = foo();
            System.out.println(result);           //输出100
        } catch (Exception e){
            System.out.println(e.getMessage());    //没有捕获到异常
        }
        try{
            result  = bar();
            System.out.println(result);           //输出100
        } catch (Exception e){
            System.out.println(e.getMessage());    //没有捕获到异常
        }
    }
    public static int foo() throws Exception
    {
      try {
            int a = 5/0;
            return 1;
        }catch(ArithmeticException amExp) {
            throw new Exception("我将被忽略,因为下面的finally中使用了return");
        }finally {
            return 100;
        }
    }
    public static int bar() throws Exception
    {
        try {
            int a = 5/0;
            return 1;
        }finally {
            return 100;
        }
    }
finally中的异常会覆盖(消灭)前面try或者catch中的异常
publicstaticvoidmain(String[] args)
{          int result;
        try{
            result = foo();
        } catch (Exception e){
            System.out.println(e.getMessage());    //输出:我是finaly中的Exception
        }
        try{
            result  = bar();
        } catch (Exception e){
            System.out.println(e.getMessage());    //输出:我是finaly中的Exception
        }
    }
    public static int foo() throws Exception
    try {
            int a = 5/0;
            return 1;
        }catch(ArithmeticException amExp) {
            throw new Exception("我将被忽略,因为下面的finally中抛出了新的异常");
        }finally {
            throw new Exception("我是finaly中的Exception");
        }
    }
    public static int bar() throws Exception
    {  try {
            int a = 5/0;
            return 1;
        }finally {
            throw new Exception("我是finaly中的Exception");
        }
    }

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

片段中的 EditText 上的空指针异常 [重复]

Java异常处理机制

Java异常处理的基础知识

Java 基础 ------- 异常

3.3 java基础总结①异常②自定义异常

片段 getArguments() 空指针异常