黑马程序员——异常

来源:互联网 发布:屏幕测试软件 编辑:程序博客网 时间:2024/05/03 07:38

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

异常
概念
阻止当前方法或者作用域继续执行的问题。

异常结构图:

1Throwable有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。

  • 1.1Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。

  • 1.2Exception(异常):是程序本身可以处理的异常。常见的异常有:NullPointerException(空引用)、ArrayIndexOutOfBoundException(数组越界)。

运行时异常
都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,
这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
非运行时异常
是 RuntimeException以外的异常,类型上都属于Exception类及其子类,这类异常必须进行处理,不处理,程序编译不能通过。
异常和错误的区别:
异常能被程序本身可以处理,错误是无法处理。
异常的处理机制

1.抛出异常
当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处
置异常的代码并执行(方法中抛出都必须使用throws字句)。
1throws抛出异常:如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常。
示例:抛出除数为0的异常

package ExceptionDemo1;class Div{    int div(int a, int b) throws Exception    {        return a / b;    }}public class ExceptionDemo2{    public static void main(String[] args) throws Exception    {        Div d = new Div();        int x = d.div(4, 0);        System.out.println("X = " + x);    }}

Throws抛出规则

  • 1如果是不可查异常(unchecked exception),即Error、RuntimeException或它们的子类,那么可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。

  • 2必须声明方法可抛出的任何可查异常(checked exception)。

  • 3仅当抛出了异常,该方法的调用者才必须处理或者重新抛出该异常。

  • 4调用方法必须遵循任何可查异常的处理和声明规则。

  • 2throw抛出异常:throw总是出现在函数体中,用来抛出一个Throwable类型的异常。

示例:抛出除数为0的RuntimeException异常。

package ExceptionDemo1;class Div{    int div(int a, int b) throws Exception    {        return a / b;    }}public class ExceptionDemo2{2捕获异常    public static void main(String[] args) throws Exception    {        Div d = new Div();        try        {            int x = d.div(4, 0);            System.out.println("X = " + x);        }        catch (Exception e)        {            throw new RuntimeException("除数不能为0");        }    }}
在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)用try、catch和finally语句捕获异常,异常总是先有地方抛出,才能捕获。
try-catch-fina语句格式
try
{
   //可能发生异常的程序代码。
}
catch(异常类型1)
{
    //捕获并处置try抛出的异常类型1
}
catch(异常类型2)
{
    //捕获并处置try抛出的异常类型2
}
finally
{
    //无论try出现异常还是不会出现异常程序一定会处理的的代码
    //1在finally语句块中发生了异常。
    //2在前面的代码中用了System.exit()退出程序。
    //3程序所在的线程死亡。
    //4关闭CPU。
}
try块:用于捕获异常
catch块:用于处理try捕获的异常。
finally块:无论是否捕获或处理异常,finally块里的语句都会被执行。

示例:捕捉除数为0
package ExceptionDemo1;class Div{    int div(int a, int b) throws Exception    {        return a / b;    }}public class ExceptionDemo1{    public static void main(String[] args)    {        Div d = new Div();        try        {            int x = d.div(4, 0);            System.out.println("X = " + x);        }        catch (Exception e)        {            System.out.println(e.toString());        }        finally        {                    }    }}

2Throwable类中的常用方法

  • 1.getCause():返回抛出异常的原因。

  • 2.getMeage():返回异常的消息信息。

  • 3.printStackTrace():对象的堆栈跟踪输出至错误输出流。

3常见的异常类

1、RuntimeException子类

  • 1.ArrayIndexOutOfBoundsException:数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出(开发中经常出现)。

  • 2.ArithmeticException:术条件异常。譬如:整数除零等。

  • 3.ClassNotFoundException:找不到类异常。

  • 4.NegativeArraySizeException:数组长度为负异常。

  • 5.ArrayStoreException:数组中包含不兼容的值抛出的异常。

  • 6.SecurityException:安全性异常。

  • 7.IllegalArgumentException:非法参数异常。

2、IOException()

  • 1.IOException:操作输入流和输出流时可能出现的异常。

  • 2.EOFException:文件已结束异常。

  • 3.FileNotFoundException:文件未找到异常。

3、其他异常

  • 1.ClassCastException:类型转换异常类(开发中经常出现)。

  • 2.ArrayStoreException:数组中包含不兼容的值抛出的异常。

  • 3.SQLException:操作数据库异常类。

  • 4.NoSuchFieldException:字段未找到异常。

  • 5.NoSuchMethodException:方法未找到抛出的异常。

  • 6.NumberFormatException:字符串转换为数字抛出的异常。

  • 7.StringIndexOutOfBoundsException:字符串索引超出范围抛出的异常(开发中经常出现)。

  • 8.IllegalAccessException:不允许访问某类异常。

  • 9.InstantiationException:当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常。

4自定义异常

步骤:

1.创建自定义异常类。

2.在方法中通过throw关键字抛出异常。

3.如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。

4.在出现异常方法的调用者中捕获并处理异常。

示例:抛出除数为0的MyException异常。

package ExceptionDemo1;class MyException extends Exception{    public MyException(String msg)    {        super(msg);    }}class Div{    int div(int a, int b) throws MyException    {        return a / b;    }}public class ExceptionDemo3{    public static void main(String[] args)throws MyException    {        Div d = new Div();        try        {            int x = d.div(4, 0);            System.out.println("X = " + x);        }        catch (Exception e)        {            throw new MyException("除数不能为0");        }    }}

0 0
原创粉丝点击