关于异常处理的一些个人见解

本文总结了常见的RuntimeException类型,如除0异常、数组越界等,区分了checked和unchecked异常,并阐述了何时使用assert进行代码自检。了解这些基础知识有助于提高应试效率。
摘要由CSDN通过智能技术生成

在这我会列出一些要记忆的基本小结论,这些结论在应试的时候会有很大的帮助。

一.常见的几种RuntimeException

1.除0异常

如:

int a=0;
int b=5/a;

产生输出为:

 

2.数组越界

如:

int[] a=new int[3];
a[0]=0;
a[1]=1;
a[2]=2;
System.out.println(a[10]);

产生输出为:

 

3.类型不兼容

如:

Integer x=10;
System.out.println((String)x);

产生输出为:

4.空指针异常

 如:

Integer x=null;
x=x+1;
System.out.println(x);

产生输出为:

二.checked异常和unchecked异常

 

由Throwable派生出来Error和Exception,由Exception派生出IOException和RuntimeException其中Error和RuntimeException共同组成unchecked异常。

checked异常

checked异常是编译器必须帮你检测的异常,如果出现问题,编译就无法通过。典型的例如文件读写,即使程序员代码没有问题,如果文件不存在而发生读写异常,编译器就会直接检查并报错,导致编译不通过。checked异常一般是那种经常发生、难以避免并需要开发者处理(try catch)的问题。

unchecked异常

编译器不会检查这类异常,这类异常一般程序员可以避免(正如上面提到的c),因此无需处理(try ...catch)。如果不处理这类异常,集成开发环境中的编译器也不会给出错误提示,可以编译通过。

unchecked异常是不需要使用try catch捕获的,因为unchecked异常都是程序员自己的程序造成的问题,属于内部可控的范畴。此时如果使用try catch来捕获异常并告知客户端,实际上代码自身的错误永远存在,永远没有被解决,无异于掩耳盗铃。对于任何的unchecked异常,程序员都应该在测试阶段就找出并且修正,要早发现早解决。而对于checked异常,必须使用try catch来显示的捕获并执行相应的处理程序,否则程序编译就无法通过。

简而言之

checked异常是时常发生的、程序员难以避免的(比如文件读写),编译器有责任帮你检查你是否做出了处理(try catch),未处理(try catch)就不能通过编译。

unchecked异常是你自己应该避免的问题(比如除0异常、数组越界、类型不兼容、空指针异常),出现unchecked异常代表你自己的代码有问题,你自己可以避免,应当早发现早改正,不应该用try catch处理,这样只是自欺欺人。

三.什么时候该用assert?

检查自己代码应该实现的东西有没有实现,就应该用assert。比如检查返回值是否满足post condition,这属于程序员的职责,如果返回值不满足post condition,assert直接终止程序,此时程序员应该修改自己的程序的错误。 

不用assert的情况:比如用户输入错误(输入不满足pre condition)、文件输入错误,这不是程序自己能够控制的,即使程序自身没有问题也有可能由于客户端的错误使用产生异常,属于外部问题,这个时候就要用try catch捕获异常而非使用assert。试想一下,如果你使用了assert检查输入合法性,那么客户端只要输入一个不满足pre condition的输入,就直接退出了程序,这很明显是不符合用户友好性的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值