黑马程序员——异常

------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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值