检查型异常 与 非检查型异常

  Java 8中将派生于 Error类RuntimeException类的所有异常称为非检查型(unchecked) 异常,
  所有其他的异常称为检查型(checked)异常。

  也就是,非检查型异常包括ErrorRuntimeException;剩下的就是检查型异常。
  可知,常见的RuntimeException为非检查型异常,
    而非检查型异常不只是RuntimeException。

检查型异常(CheckedException) 用于表示可恢复的异常(也就是你必须检查的异常);
而非检查型异常(RuntimeException、Error)表示不可恢复的异常(也就是运行时异常,主要是程序bug和致命错误,不需要程序员来检查)。


非检查型异常

  谁去检查编译器
  谁去处理用户或者 不处理
  什么时候发生:运行时异常
  需要干什么:修改错误的代码、抛出给父类、或者输出一条提示信息(一般用于自定义异常)

  非检查型异常要么在你的控制之外(Error),要么是由一开始就应该避免的情况所导致的(RuntimeException)。

  例如:你的程序逻辑本身有问题,
    比如数组越界、访问null对象,这种错误你自己是可以避免的。
    编译器不会强制你检查这种异常。

常见的RuntimeException类型的异常主要有以下几种。
□ ArithmeticException:数学计算异常。
□ NullPointerException:空指针异常。
□ NegativeArraySizeException:负数组长度异常。
□ ArrayOutOfBoundsException:数组索引越界异常。
□ ClassNotFoundException:类文件未找到异常。
□ ClassCastException:类型强制转换异常。
□ SecurityException:违背安全原则异常。


检查型异常

  谁去检查编译器
  谁去处理用户必须处理
  什么时候发生:编译时异常
  需要干什么:(try …catch)或者 在方法首部抛出异常(两者其一必须要做

  例如:一个读取文件的方法代码逻辑没有错误,
    但程序运行时可能会因为文件找不到而抛出FileNotFoundException,
    如果不处理这些异常,程序将来肯定会出错。
    所以编译器会提示你要去捕获并处理这种可能发生的异常,不处理就不能通过编译。

  下面是jdk给的格式示例:

private static void Write(){
	try{
		File file =new Filw("Filename.txt");
		FileOutputStream fos = new FileOutputStream(file);
		PrintStream ps =new PrintStream(fos);
		ps.print("blahblah");
		ps.close();
	}catch(IOException e) {
              e.printStackTrace();
          }
}

private static void Write()throws IOException{
		// 创建文件“Filename.txt”对应File对象
		File file =new Filw("Filename.txt");
		FileOutputStream fos = new FileOutputStream(file);
		// 创建FileOutputStream对应的PrintStream,方便操作。PrintStream的写入接口更便利
		PrintStream ps =new PrintStream(fos);
		ps.print("blahblah");
		ps.close();
}

常见检查型异常主要有以下几种。
□ NoSuchMethodException:方法未找到异常。
□ IOException:输入输出异常。
□ EOFException:文件已结束异常。
□ FileNotFoundException:文件未找到异常。
□ NumberFormatException:字符串转换为数字异常。
□ SQLException:操作数据库异常


一个例子以总结:

  假设一个Download函数,
  根据传入的URL (String参数,如,URL:file://vms.host.edu/disk$user/my/notes/note12345.txt)
  去访问一个网页中的.txt文本。
  就有以下两种情况:

1.如果传入的URL 参数是null,比如note12345.txt或者路径不存在

    表明该函数的调用者出现bug了,
    而程序本身的bug是很难在运行时自我恢复的
    这时候就需要让Download函数抛出非检查型异常(RunntimeException),
    如NullPointerException。
    并且Download函数的调用者不应该尝试处理这个异常,
    必须让它尽早地暴露出来(比如让JVM自己终止运行)。

2.如果传入的URL参数是一个不合法的URL格式的字符串(可能格式输错了),

    这时候Download函数需要抛出检查型异常(CheckedException),如IOExcepiton。
    并且Download函数的调用者
    必须捕获该异常和进行相应的处理
如:

throw new IOException("请重新输入 URL");
  • 9
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Robinτ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值