Java异常与throw与throws及注意事项

一、基础知识

1、处理异常,java提供了一个优秀的解决方案:异常处理机制。

java把异常当作对象来处理,所有的异常都是由Throwable继承而来,但在下一层立即分解为两个分支:Error和Exception

2、Error类:这类异常由java虚拟机生成并抛出,大多数错误与代码编写者无关,不能被程序员通过代码来处理。发生这种异常时,java虚拟机一般会选择关闭线程。Error异常很少出现,所以我们更应该关注Exception分支下异常。

Exception类:这类异常通常可以被程序处理,也是我们需要关注的重点。

根据javac对异常处理的要求,我们可以将异常分为两类:

非受查异常:java语言规范将派生于Error类或RuntimeException类的所有异常称为非受查异常。javac在编译时,不会提示和发现这类异常,不要求在程序中处理这些异常。这样的异常多半是代码写的有问题,比如除零、数组越界、空指针异常等。

受查异常:除了Error类或RuntimeException类的所有异常。javac在编译时,会检查这类异常,要么通过try-catch语句进行捕获,要么通过throws语句进行抛出,否则编译不通过。

非受查异常为编译器不要求强制处理的异常,受查异常则是编译器必须处理的异常。

二、异常处理机制

异常处理机制的本质是抛出异常捕获异常

2.1、抛出异常

有些异常,我们不知道该如何处理或者说交给调用者处理更好。我们就需要将这种类型的异常抛出,交给上一级去处理,或者可以继续抛出,交给更高一级的调用者去处理。

抛出异常有两个关键字:throwthrows

throws:抛出方法中可能导致的异常,这个异常并不一定发生。这有利于调用者及时处理这些可能发生的异常,保护自己的程序。方法中抛出的所有受查异常,必须通过throws子句抛出,否则会导致编译错误。

例如:public void method throws EOFException,FileNotFoundException,...{

    //method body
}这种异常在方法中抛出后不用在方法体中catch了,由调用该方法的方法去处理catch异常。
throw:抛出明确的异常,throw后面的任何语句不会被执行,一般是程序员主动抛出。
public class Java8Tester {
    public static void main(String args[]) {
        throwTest(null);
    }
    public static void throwTest(String input) {
        if (input == null) {
            throw new NullPointerException();
        }
    }
}
方法throwTest主动抛出一个异常返回给调用方,调用方需要处理该异常或者抛出。

2.2、捕获异常

1)如果代码可能抛出多种异常,相应的我们也要使用多个catch子句进行捕获。当异常发生时,每个catch子句会被依次检查,当第一个匹配的子句被执行时,捕获结束,其他的子句将不会再检查。所以这里有一个重要原则:先子类后父类

2)finally子句是可选项,可有可无。无论出不出现异常,finally都会在try/catch之后执行。

  • 不要再finally里使用return,会覆盖前面的返回值。
  • 不要在finally里抛出异常,会抑制前面抛出的异常。
  • 尽量不要再finally里做其他事,finally仅仅用于释放资源最合适。
  • 尽量将所有的return写在方法的最后,不要写在try/catch/finally中。

摘自:https://www.cnblogs.com/maikucha/p/8435906.html

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值