运行时异常与受检异常有何异同

2020-11-18 13:58发布

7条回答
lucas
2楼 · 2020-11-18 17:25
  • 运行时异常,表示程序运行时发生的异常,程序代码设计的合理就不会发生;

  • 检查异常跟程序运行的上下文环境有关,即便设计无误,也有可能出现;

  • Java编译器要求必须声明抛出未被捕获的检查异常,但不要求必须声明抛出运行时异常。


freediandianer
3楼 · 2020-11-18 18:24

Throwable是所有Java程序中错误处理的父类 ,有两种资类:Error和Exception。Error:表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误 ,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。 Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形.应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出).假如出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的. Exception:表示可恢复的例外,这是可捕捉到的。 Java提供了两类主要的异常 :runtime exception和checked exception。 checked异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。 对于这种异常, JAVA编译器强制要求我们必需对出现的这些异常进行catch 。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。 这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误. 但是另外一种异常: runtime exception ,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过 NullPointerException 异常,它就是运行时异常,并且这种异常还是最常见的异常之一。 RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等.处理RuntimeException的原则是:假如出现RuntimeException,那么一定是程序员的错误.例如,可以通过检查数组下标和数组边界来避免数组越界访问异常. 出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出 ,如果是单线程就被main()抛出 。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你 如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。 如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。 在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误, 如果退出程序比较好,这时你就可以不太理会运行时异常 ,或者是通过对异常的处理显式的控制程序退出。 异常处理的目标之一就是为了把程序从异常中恢复出来。

我是大脸猫
4楼 · 2020-11-18 15:01

java程序设计语言提供了三种可抛出结构:受检查时异常(checked exception),运行时(run-time exception)和错误 (error)

java异常:受检查时异常和运行时异常(非编译时异常)

首先介绍一下我们常见的集中描述:受检查时异常,编译异常,非运行时异常 描述可以理解为同一个意思,

运行时异常,非编译时异常,非受检查时异常 等同      // 非受检查的可抛出结构:运行时异常(或者说是非编译时异常)和错误(error)

不要把可抛出结构和可抛出异常混着理解:error和exception类都是继承Throwable类 

 

RunTimeException继承Exception

 

在决定使用受检的异常或者未受检的异常时,主要的原则是:如果期望调用者能够使当地恢复,对于这种情况就应该使用受检查时异常。

有两种未受检查的可抛出结构:运行时异常和错误,在行为上两者等同的:他们都是补虚药也不应该被捕获的可抛出结构。如果程序抛出未收件的异常或者错误,往往就属于不可恢复的情形,继续执行下去有害无益。如果程序没有捕获到这样的可抛出结构,讲会导致当前线程停止,并出现适当的错误消息。

运行时异常:RunTimeException 

受检查异常:Exception

编译时异常要么加throws 要么加try.....catch,不像运行时异常一样可以什么都不加,因为运行时异常只有运行到他的时候才能发现的错误,在编译期跟正常代码一样所以不会强制加这些,但是编译时异常在你编译的时候已经发现了有可能的错误情况会强制你添加异常处理(要么交给虚拟机或者线程,要么自己处理)

各举例子

运行时异常:

package my;import javax.management.RuntimeErrorException;public class test {public static void main(String[] args)  {    System.out.println("a");        pp();    System.out.println("b");}public static void pp() throws RuntimeException {    throw new RuntimeException("sa");}}

main函数里面可以pp()函数不用try...catch....但是会把错误直接抛给main函数main函数所在线程将会终止,如果main函数也写throws RuntimeException 那么将错误抛给虚拟机,虚拟机终止 ,所以都只输出 a 和异常  sa

修改代码:

package my;import javax.management.RuntimeErrorException;public class test {public static void main(String[] args)  {     System.out.println("a");     try{ pp();     }catch(RunTimeException e){ }System.out.println("b");   }public static void pp() throws RuntimeException {        throw new RuntimeException("sa");}}

此时pp()函数的异常已被main函数自己处理,则只会报错下边也会执行   

运行结果:

a    b   为什么没有sa那时因为已被捕获但是在catch里面没有被输出

 

受检查异常:

package my;import javax.management.RuntimeErrorException;public class test { public static void main(String[] args)throws Exception {  System.out.println("a");     pp();  System.out.println("b"); } public static void pp() throws Exception {  throw new Exception("sa"); }}

运行结果:

a sa

修改代码:

package my;import javax.management.RuntimeErrorException;public class test { public static void main(String[] args) {  System.out.println("a");  try {   pp();  } catch (Exception e) {  }  System.out.println("b"); } public static void pp() throws Exception {  throw new Exception("sa"); }}

运行结果:a b    此时sa不输出是因为在mai函数中已经捕获但是没输出


赵小刀
5楼 · 2020-11-19 14:46

一、定义不同


运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等。一般异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。


二、处理方法不同


运行时异常是不检查异常,程序中可以选择捕获处理,也可以不处理。对于一般异常,JAVA编译器强制要求用户必需对出现的这些异常进行catch并处理,否则程序就不能编译通过。


是你的小甜心呀
6楼 · 2020-11-19 17:23
1.定义不同,运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等。一般异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。
2.处理方法不同,运行时异常是不检查异常,程序中可以选择捕获处理,也可以不处理。对于一般异常,JAVA编译器强制要求用户必需对出现的这些异常进行catch并处理,否则程序就不能编译通过。
3.发生原因不同,运行时异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。


天天
7楼 · 2020-11-20 17:56

非受检异常指的是java.lang.RuntimeException和java.lang.Error类及其子类,所有其他的异常类都称为受检异常。两种类型的异常在作用上并没有差别,唯一的差别就在于使用受检异常时的合法性要在编译时刻由编译器来检查。正因为如此,受检异常在使用的时候需要比非受检异常更多的代码来避免编译错误。


放学别走
8楼 · 2021-01-15 19:39

Java与异常和错误有关的类有Error和Exception。

Error、Exception 都是 java.lang包下Throwable类的子类。  

Error 是程序无法处理的错误,表示运行应用程序时出现的较为严重的问题。大多数错误与代码编写者执行的操作无关,而表示

代码运行时 JVM(Java 虚拟机)出现了问题。如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。  

Exception 表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。  

Exception类又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception );  

运行时异常编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。  

而受检查的异常,即:可以通过代码的方式对可能出现的异常进行检查,比如用throws关键字声明异常,或者用try...catch捕获异常。


相关问题推荐

  • 回答 2

    Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。我们可以通过它的getResultSet方法来获取ResultSet,或者通过getUpda...

  • 回答 22

    忙的时候项目期肯定要加班 但是每天加班应该还不至于

  • 回答 108
    已采纳

    虽然Java人才越来越多,但是人才缺口也是很大的,我国对JAVA工程师的需求是所有软件工程师当中需求大的,达到全部需求量的60%-70%,所以Java市场在短时间内不可能饱和。其次,Java市场不断变化,人才需求也会不断增加。马云说过,未来的制造业要的不是石油,...

  • 回答 5
    已采纳

    工信部证书含金量较高。工信部是国务院的下属结构,具有发放资质、证书的资格。其所发放的证书具有较强的权威性,在全国范围内收到认可,含金量通常都比较高。 工信部证书,其含义也就是工信部颁发并承认的某项技能证书,是具有法律效力的,并且是国家认可的...

  • 回答 70
    已采纳

    学Java好不好找工作?看学完Java后能做些什么吧。一、大数据技术Hadoop以及其他大数据处理技术都是用Java或者其他,例如Apache的基于Java 的 HBase和Accumulo以及ElasticSearchas。但是Java在此领域并未占太大空间,但只要Hadoop和ElasticSearchas能够成长壮...

  • 回答 16
    已采纳

    就是java的基础知识啊,比如Java 集合框架;Java 多线程;线程的五种状态;Java 虚拟机;MySQL (InnoDB);Spring 相关;计算机网络;MQ 消息队列诸如此类

  • 回答 12

    #{}和${}这两个语法是为了动态传递参数而存在的,是Mybatis实现动态SQL的基础,总体上他们的作用是一致的(为了动态传参),但是在编译过程、是否自动加单引号、安全性、使用场景等方面有很多不同,下面详细比较两者间的区别:1.#{} 是 占位符 :动态解析 ...

  • 回答 62

    没问题的,专科学历也能学习Java开发的,主要看自己感不感兴趣,只要认真学,市面上的培训机构不少都是零基础课程,能跟得上,或是自己先找些资料学习一下。

  • 回答 4

    1、反射对单例模式的破坏采用反射的方式另辟蹊径实例了该类,导致程序中会存在不止一个实例。解决方案其思想就是采用一个全局变量,来标记是否已经实例化过了,如果已经实例化过了,第 二次实例化的时候,抛出异常2、clone()对单例模式的破坏当需要实现单例的...

  • 回答 5

     优点: 一、实例控制  单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。 二、灵活性  因为类控制了实例化过程,所以类可以灵活更改实例化过程。 缺点: 一、开销  虽然数量很少,但如果每次对象请求引用时都要...

  • 回答 4

    这个主要是看你数组的长度是多少, 比如之前写过的一个程序有个数组存的是各个客户端的ip地址:string clientIp[4]={XXX, xxx, xxx, xxx};这个时候如果想把hash值对应到上面四个地址的话,就应该对4取余,这个时候p就应该为4...

  • 回答 6

     哈希表的大小 · 关键字的分布情况 · 记录的查找频率 1.直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。...

  • 回答 6

    哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%)。而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上。所以这里最后采用了质数做模的除数。 因为用质数做了模的除数,自然存储空间的大小也用质数了...

  • 回答 2

    是啊,哈希函数的设计至关重要,好的哈希函数会尽可能地保证计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间

  • 回答 3

     解码查表优化算法,seo优化

  • 回答 5

    1.对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值。2.哈希值就是这个元素的位置。3.如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就...

没有解决我的问题,去提问