java受检异常与运行时异常

正确运用异常处理机制,有助于提高程序的健壮性。
所谓程序的健壮性,就是指程序在多数情况下能够正常运行,返回预期的正确结果;如果偶尔遇到异常情况,程序也能采取周到的解决措施。

受检查异常表示程序可以处理的异常,如果抛出异常的方法本身不能处理它,那么方法调用者应该去处理它,从而使程序恢复运行,不至于终止程序。

例如,喷墨打印机在打印文件时,如果纸用完或者墨水用完,就会暂停打印,等待用户添加打印纸或更换墨盒,如果用户添加了打印纸或更换了墨盒,就能继续打印。 可以用OutOfPaperException类和OutOfInkException类来表示纸张用完和墨水用完这两种异常情况,由于这些异常是可修复的,因此是受检查异常,可以把它们定义为Exception类的子类.

public class OutOfPaperException extends Exception{…}
public class OutOfInkException extends Exception{…}

打印机的print()方法:

public void print()  
{      
 while(文件未打印完) {  
      try {    打印一行   }   
      catch(OutOfInkException e) {     
      do  {  等待用户更换墨盒  }    while(用户没有更换墨盒) } 
      catch(OutOfPaperException e) { 
       do  {  等待用户添加打印纸 }  while(用户没有添加打印纸)}    
      }   
}    

运行时异常表示无法让程序恢复运行的异常,导致这种异常的原因通常是由于执行了错误操作。一旦出现了错误操作,建议终止程序,因此Java编译器不检查这种异常。

如果程序代码中有错误,就可能导致运行时异常,如for语句的循环条件不正确,会导致ArrayIndexOutOfBoundsException。
运行时异常是应该尽量避免的,在程序调试阶段,遇到这种异常时,正确的做法是改进程序的设计和实现方式,修改程序中的错误,从而避免这种异常。捕获它并且使程序恢复运行并不是明智的办法,因为即使程序恢复运行,可能会导致程序的业务逻辑错乱,导致更严重的异常,或者得到错误的运行结果

java什么情况下必须用throws抛出异常?
在程序中抛出了非RuntimeException异常却没有对其处理(用try catch块处理)的情况下,必须在方法头throws该异常。

什么情况下需要自定义异常呢?
通常情况下是程序运行状态与用户的预先定义的逻辑不符合,但程序并不能识别这种逻辑错误时需自定义异常。比如某个方法的参数只能接受0~9的数字,数字1除外,万一用户要是输入了1,我们可以自定义一个异常来处理1这个意外,从而控制程序流程等。

什么情况下捕获异常应该立即处理呢?
比如说接收用户输入整型值,而用户却输入了不能解析成整型的字符串,这会抛出异常,我们不应该往外抛,而应该立即处理之,提示用户输入合法的值,待用户输入合法值之后,接着往下执行程序。捕获到异常之后一般处理办法是输出错误日志,或者给用户一些提示。

  • 小结

Exception异常分为:RuntimeException(运行时异常,也叫未检查异常或不受检查异常)和已检查异常(或受检查异常)。
已检查异常 是指程序员已经足够小心的检查了他的代码,但是还是不能保证代码不出现异常;
如,程序要访问某个文件,但访问时文件不存在,这和程序本身没有太大关系;再如,程序要进行网络连接,但执行时没有连接网线,这些问题都是已检查异常。

未检查异常 一般是由程序员没有细心检查代码而导致的。
如空指针异常、数组越界、类型转换异常等都是由于程序员粗心大意造成的。这些异常是在编码过程中是能够避免的。

看到此你需要思考:我们需要处理的到底是已检查异常还是未检查异常?如一幢大楼运行过程中被雷击中,这肯定是已检查异常,但运行过程中发现有个地方四周没有窗户和门,这就是未检查异常,那到底我们需要针对哪个异常进行应急预案呢?当验收大楼时肯定政府部门要检查你的抗震级别,消防措施等,这些措施是你在修建时必须考虑,而且要求是强制执行的,那么这个要求就是必须处理的,如果不处理则编译通不过。如果出现未检查异常,那就只能加门或窗户,即修改代码了。

从另外一个角度来讲,已检查异常(受检查异常)就是受编译器检查的异常运行时异常,属于RuntimeException类及子类范围的类(以及衍生类)都属于运行时异常。 受检查异常,在Exception范围内,除了运行时异常的类都是受检查异常类,为checked exception 它们之间的区别在于: 例如在代码中写了 throw new Exception(); 和 throw new RuntimeException(); 两者都会在运行期间抛出异常!(1)但是在编译阶段前者属于抛出一个受检查异常,要求对它进行显式的try..catch捕获处理或者向上一层方法抛出,否则在编译期间就显示错误! (2)后者抛出是运行时异常,在编译阶段不予检查,语法上不会显示任何错误(throws处没声明不会出错,但最好声明)!

所以简单的通过throw手动抛出受检查异常和抛出运行时异常,前者要求显式处理,后者不要求作出处理。
我以为的设计原则:
(1)受检查异常如FileNotFoundException,编译时期受检查,提醒用户try{}catch{}或者throw到上一层,当然你可以一直throw直至抛给虚拟机,然而这并不是好的方式,因为对于这个异常,我们是可以进行一些处理,挽救的,比如我们可以在捕获到异常的时候,提醒用户”找不到文件”,用户就可以根据这个信息,把相应文件放到指定位置,从而解决问题,并不需要终止程序,或者修改代码。

(2)而对于非受检查异常如ArrayIndexOutOfBoundsException(数组越界异常),编译时期不提供错误检查,我想是因为,针对这个错误,用户是无能为力的,同样程序员也是部分无能为力的,你不可能通过try{}catch{}去捕获这个异常之后,再去增加数组容量。这时你所能做的,只能是去修改代码,如修改数组容量,或换个自增的数据结构。这种运行时错误,只能通过在编译阶段,依靠程序员的小心谨慎来避免。

以上学习自百度文库,讲解的很清楚。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java 中的异常分为两种类型:受检异常(checked exceptions)和受检异常(unchecked exceptions)。 受检异常是指在代码编译期间就需要处理的异常,必须在方法签名中声明并处理,否则代码将无法通过编译。常见的受检异常包括 `IOException`、`SQLException`、`ClassNotFoundException` 等。当代码可能抛出受检异常,可以使用 `try...catch` 块或 `throws` 关键字来处理异常。示例代码如下: ``` public void readFile(String fileName) throws IOException { BufferedReader br = null; try { br = new BufferedReader(new FileReader(fileName)); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { System.err.println("读取文件出错:" + e.getMessage()); throw e; } finally { if (br != null) { try { br.close(); } catch (IOException e) { System.err.println("关闭文件出错:" + e.getMessage()); } } } } ``` 在上面的代码中,`readFile` 方法声明了 `IOException` 异常,表示该方法可能抛出 `IOException` 异常。在方法内部,我们使用 `try...catch` 块来捕获可能抛出的 `IOException` 异常,并在 `catch` 块中打印错误信息,并将异常重新抛出。最后,我们在 `finally` 块中关闭文件流,并在可能出现的异常情况下打印错误信息。 受检异常是指在运行时才能发现的异常,不需要在方法签名中声明,也不需要进行处理。常见的受检异常包括 `NullPointerException`、`ArrayIndexOutOfBoundsException`、`ClassCastException` 等。当代码可能抛出受检异常,可以使用 `try...catch` 块来捕获异常并进行处理,但是这样做并不是必须的。示例代码如下: ``` public int divide(int a, int b) { if (b == 0) { throw new IllegalArgumentException("除数不能为零"); } return a / b; } ``` 在上面的代码中,`divide` 方法可能抛出一个 `IllegalArgumentException` 异常,表示除数不能为零。由于 `IllegalArgumentException` 是一个受检异常,我们不需要在方法签名中声明该异常,也不需要使用 `try...catch` 块来处理异常。当方法抛出该异常,调用该方法的代码可以选择捕获异常并进行处理,或者将异常继续抛出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值