千家信息网

怎样浅析Java语言中两种异常的差别

发表于:2025-02-05 作者:千家信息网编辑
千家信息网最后更新 2025年02月05日,怎样浅析Java语言中两种异常的差别,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。浅析Java语言中两种异常的差别Java提供了两类主要
千家信息网最后更新 2025年02月05日怎样浅析Java语言中两种异常的差别

怎样浅析Java语言中两种异常的差别,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

浅析Java语言中两种异常的差别

  Java提供了两类主要的异常:runtime exception和checked exception。所有的checked exception是从java.lang.Exception类衍生出来的,而runtime exception则是从java.lang.RuntimeException或java.lang.Error类衍生出来的。

  它们的不同之处表现在两方面:机制上和逻辑上。

  一、机制上

  它们在机制上的不同表现在两点:1.如何定义方法;2. 如何处理抛出的异常。请看下面CheckedException的定义:

  public class CheckedException extends Exception
  {

  public CheckedException() {}
  public CheckedException( String message )
  {
  super( message );
  }
  }

  以及一个使用exception的例子:

  public class ExceptionalClass
  {

  public void method1()
  throws CheckedException
  {
   // ... throw new CheckedException( "...出错了" );
  }
  public void method2( String arg )
  {
   if( arg == null )
   {
    throw new NullPointerException( "method2的参数arg是null!" );
   }
  }
  public void method3() throws CheckedException
  {
   method1();
  }
  }

  你可能已经注意到了,两个方法method1()和method2()都会抛出exception,可是只有method1()做了声明。另外,method3()本身并不会抛出exception,可是它却声明会抛出CheckedException。在向你解释之前,让我们先来看看这个类的main()方法:

  public static void main( String[] args )
  {

  ExceptionalClass example = new ExceptionalClass();
  try
  {
  example.method1();
  example.method3();
  }
  catch( CheckedException ex ) { } example.method2( null );
  }

  在main()方法中,如果要调用method1(),你必须把这个调用放在try/catch程序块当中,因为它会抛出Checked exception。

  相比之下,当你调用method2()时,则不需要把它放在try/catch程序块当中,因为它会抛出的exception不是checked exception,而是runtime exception。会抛出runtime exception的方法在定义时不必声明它会抛出exception。

  现在,让我们再来看看method3()。它调用了method1()却没有把这个调用放在try/catch程序块当中。它是通过声明它会抛出method1()会抛出的exception来避免这样做的。它没有捕获这个exception,而是把它传递下去。实际上main()方法也可以这样做,通过声明它会抛出Checked exception来避免使用try/catch程序块(当然我们反对这种做法)。

  小结一下:

  * Runtime exceptions:

  在定义方法时不需要声明会抛出runtime exception;

  在调用这个方法时不需要捕获这个runtime exception;

  runtime exception是从java.lang.RuntimeException或java.lang.Error类衍生出来的。

  * Checked exceptions:

  定义方法时必须声明所有可能会抛出的checked exception;

  在调用这个方法时,必须捕获它的checked exception,不然就得把它的exception传递下去;

  checked exception是从java.lang.Exception类衍生出来的。

  二、逻辑上

  从逻辑的角度来说,checked exceptions和runtime exception是有不同的使用目的的。checked exception用来指示一种调用方能够直接处理的异常情况。而runtime exception则用来指示一种调用方本身无法处理或恢复的程序错误。

  checked exception迫使你捕获它并处理这种异常情况。以java.net.URL类的构建器(constructor)为例,它的每一个构建器都会抛出MalformedURLException。MalformedURLException就是一种checked exception。设想一下,你有一个简单的程序,用来提示用户输入一个URL,然后通过这个URL去下载一个网页。如果用户输入的URL有错误,构建器就会抛出一个exception。既然这个exception是checked exception,你的程序就可以捕获它并正确处理:比如说提示用户重新输入。

  再看下面这个例子:

  public void method()
  {

  int [] numbers = { 1, 2, 3 };
  int sum = numbers[0] numbers[3];
  }

  在运行方法method()时会遇到ArrayIndexOutOfBoundsException(因为数组numbers的成员是从0到2)。对于这个异常,调用方无法处理/纠正。这个方法method()和上面的method2()一样,都是runtime exception的情形。上面我已经提到,runtime exception用来指示一种调用方本身无法处理/恢复的程序错误。而程序错误通常是无法在运行过程中处理的,必须改正程序代码。

  总而言之,在程序的运行过程中一个checked exception被抛出的时候,只有能够适当处理这个异常的调用方才应该用try/catch来捕获它。而对于runtime exception,则不应当在程序中捕获它。如果你要捕获它的话,你就会冒这样一个风险:程序代码的错误(bug)被掩盖在运行当中无法被察觉。因为在程序测试过程中,系统打印出来的调用堆栈路径(StackTrace)往往使你更快找到并修改代码中的错误。有些程序员建议捕获runtime exception并纪录在log中,我反对这样做。这样做的坏处是你必须通过浏览log来找出问题,而用来测试程序的测试系统(比如Unit Test)却无法直接捕获问题并报告出来。

看完上述内容,你们掌握怎样浅析Java语言中两种异常的差别的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

程序 方法 处理 错误 问题 衍生 运行 差别 语言 不同 代码 指示 机制 用户 过程 逻辑 测试 输入 例子 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库技术及应用试验答案 网络安全公益公告 银联软件开发创新服务 软件开发与应用属什么范畴 国家网络安全体系建设 山西微服务架构数据库 花园战争2哪个服务器好 批量插入数据库 可信的重庆电信服务器托管云空间 联想个人云 数据库检测 异常 速达使用显示数据库密码错误 树形数据库干什么用 周口网络技术销售价格 影子经纪人网络安全 网络安全面临的主要威胁是3种 网络软件开发龙头的上市公司 网络安全小知识你都了解吗 乌鲁木齐深圳网络安全培训 国家建立网络安全信息 纽康数研网络技术有限公司上海 学习it网络安全 如何使用饥荒联机版的专用服务器 软件开发工资待遇如何 机房服务器灰尘吹风机清理 php数据库开发 华为自主服务器cpu 河北互联网软件开发定制 网络安全监管局是什么机构 恢复数据库表删除 河南爱众软件开发有限公司怎么样
0