Java异常(违例)与捕获

异常的分类

  • 几乎所有的代码都会出现异常,为了保证程序在出现异常之后可以正常执行完毕,就需要异常处理。

  • 在java程序设计语言中,异常对象都是派生于Throwable类的一个实例

  • 下图是java异常层次结构的一个简化示意图
    在这里插入图片描述

  • 所有的异常都是有Throwable继承而来,但在下一层立即分解为两个分支:Error和Exception

  • Error(栈溢出异常):Error类描述Java运行时内部错误与资源耗尽错误。应用程序不抛出此类异常,这种内部错误一旦出现,除了告知用户并使程序安全终止之外,别无他法

  • Exception层次结构又分解为两个分支RuntimeException(运行时异常) :由于程序错误导致的异常
    IOException:程序本身没有问题,但由于出现I/O问题导致的异常(例如:打开一个并不存在的文件)

  • java语言规范将继承于Error与RuntimeException类的所有异常子类称为非受查异常(不强制用户进行异常处理);所有其他的异常称为受查异常

异常的处理格式

  • 为了保证程序出现异常后也能正常执行下去,需要进行异常处理
  • 在遇到一个异常之后,java便把异常抛了出来,可是抛出来后没有程序代码区捕获它,所以程序就会结束,不会接着执行;如果加上捕获异常的程序代码,则可针对不同的异常做不同的处理,这种处理的方式称为异常处理
  • 异常处理是由try,catch,finally3个关键字所组成的程序块,语法如下:
try{
    // 要检查的语句(有可能出现异常的语句)
}[catch(异常类   对象名称] {
    //出现异常后的解决方案
}[finally{
    //异常出口,无论是否产生异常,均会执行finally代码块
    }   ]

1.首先,我们把所有可能出现异常的语句都放在一个try之后的{ }所形成的区块中;
程序通过try{ }区块准备捕获异常,try区块要是有异常发生,程序的运行便中断,并抛出“异常类所产生的对象”
2.抛出的对象如果属于catch()括号内想要捕获的异常类,catch则会捕获此异常,然后进入catch的块里继续运行
3.无论是否产生异常,最终一定会执行finally块里的程序代码  


//即便try,catch中存在return语句,也会在return之前执行finally代码块
    //如果finally里面没有return,则代码正常返回
finally块是可以省略的,可以有以下组合:
try..catch
try..finally
try...catch...fianlly..
  • 当异常发生时,通常可以用两种方法来处理,一种交由java默认的异常处理机制做处理,但这种处理方式,java通常只能输出异常信息,接着便终止程序的运行;另一种处理方式是用自行编写的try–catch–finally块来捕获异常,可以灵活的操控程序的流程,做出最适当的处理

throws关键字

  • 用throws关键字声明的方法表示此方法不处理异常,而由系统自动将捕获的异常信息抛给上级调用方法
访问权限  返回值类型   方法名称 (参数列表) throws  异常类
{
        //方法体;
}

若有异常,则将该异常提交给直接使用这个方法的方法
  • throws用在方法上
public class Test{
    public static void main(String[] args) {
        try{
            System.out.println(caculate(10,0));
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    public static int caculate(int x,int y)throws Exception{
        return x/y;
    }
}
  • 主方法抛出异常,这个时候产生的异常就会交给JVM处理
public class Test{
    public static void main(String[] args)throws Exception {
        System.out.println(calculate(10,0));
    }
    public static int calculate(int x,int y)throws Exception{
        return x/y;
    }
}

throw关键字

  • 所有异常类对象都是由JVM自动化实例的,但有时用户希望能亲自进行异常类对象的实例化操作,自己手工抛出异常,那么此时就需要依靠throw关键字来完成
public class Test{
    public static void main(String[] args) {
     try{
         throw new Exception("抛个异常");
     }catch(Exception e){
         e.printStackTrace();
     }
    }
}

throws和throw区别

  • 1. throws用于方法内部,主要表示手工异常抛出
  • 2.throws主要在方法声明上使用,明确告诉用户本方法可能产生的异常,同时该方法可能不处理异常

Exception与RuntimeException的区别

  • 使用Exception是RuntimeException的父类,使用Exception定义的异常都要求必须使用异常处理,而使用的RuntimeException定义的异常可以由用户选择性的来进行异常处理

java中几个常见的异常

算术异常:ArithmeticException
空指针异常:NullPointerException
文件未找到异常:FileNotFoundException
数组下标越界异常:ArrayIndexOutOfBoundsException
内存不足异常:OutOfMemoryException

猜你喜欢

转载自blog.csdn.net/WZL995/article/details/83901821