异常处理机制】运行时异常与受检异常有何异同?_第2页回答

2021-11-10 09:22发布

16条回答
帅帅马
2楼 · 2021-11-14 10:39

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函数中已经捕获但是没输出


20200921文 - 做更棒的自己!
3楼 · 2021-11-14 10:45

1、含义不同:检查异常就是编译器要求你必须处置的异常。不知道你编程的时候有没有遇到过,你写的某段代码,编译器要求你必须要对这段代码trycatch,或者throwsexception。

非检查异常是编译器不要求强制处置的异常,虽然有可能出现错误,但是不会在编译的时候检查。

2、运行时情况不同:运行时异常都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是非检查异常,程序中可以选择捕获处理,也可以不处理。

这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。


我的网名不再改
4楼 · 2021-11-17 11:38

异常表示程序运行过程中可能出现的非正常状态


 


运行时异常,表示程序代码在运行时发生的异常,程序代码设计的合理,这类异常不会发生

受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发

Java编译器要求方法必须声明抛出可能发生未被捕获的受检异常,不要求必须声明抛出运行时异常


summer
5楼 · 2021-11-17 15:28

运行时异常与受检异常有何异同? 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。 受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。

123无语呀
6楼 · 2021-11-19 16:47

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



visonx
7楼 · 2021-12-17 10:30

不要将异常处理用于正常的控制流(设计良好的API不应该强迫它的调用者为了正常的控制流而使用异常)

  · 对可以恢复的情况使用受检异常,对编程错误使用运行时异常

  · 避免不必要的使用受检异常(可以通过一些状态检测手段来避免异常发生)

  · 优先使用标准的异常

  · 每个方法抛出的异常都要有文档

  · 保持异常的原子性

  · 不要在catch中忽略掉捕获到的异常


异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。

希希
9楼 · 2021-12-26 11:17

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。Java编译器要求方法必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出未被捕获的运行时异常。





相关问题推荐

  • 回答 19

    1)作用不同: throw用于程序员自行产生并抛出异常; throws用于声明在该方法内抛出了异常2) 使用的位置不同: throw位于方法体内部,可以作为单独语句使用; throws必须跟在方法参数列表的后面,不能单独使用。3)内容不同: throw抛出一个异常对象,且只能是...

  • 回答 11

    基本执行过程如下:1)程序首先执行可能发生异常的try语句块。2)如果try语句没有出现异常则执行完后跳至finally语句块执行;3)如果try语句出现异常,则中断执行并根据发生的异常类型跳至相应的catch语句块执行处理。4)catch语句块可以有多个,分别捕获不同类型...

  • 回答 10

    Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java 中,每个异常都是一个对象,它是Throwable 类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获...

  • 回答 5

    OutOf MemoryError这种错误可以细分为多种不同的错误,每种错误都有自身的原因和解决办法,如下所示:java.lang.OutOfMemoryError: Java heap space 错误原因:此OOM是由于JVM中heap的最大值不满足需要。 解决方法:1) 调高heap的最大值,即-Xmx的值调大。...

  • 回答 6

    问题的根本原因是工程中某个jar包的版本(jar包编译时的所用的jdk版本)高于工程build path中jdk的版本,这个是不兼容的! 编程中遇到此异常Unsupported major.minor version 52.0(根据版本号,这里可以为其他数值,52是1.8jdk jar包与 1.8以下低版本jdk不匹配)...

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