Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不需要在编译时捕获运行时异常_Java - Fatal编程技术网

Java 为什么不需要在编译时捕获运行时异常

Java 为什么不需要在编译时捕获运行时异常,java,Java,检查过的异常需要在编译时捕获或声明为抛出,但运行时异常不需要…为什么我们只对检查过的异常重要…查看异常的名称“RunTime” 在编译时,编译器可以准确地看到大多数代码中可能出现的错误以及错误的位置 但是,某些对象/值只能在运行时进行计算,不幸的是,编译器无法预见这一点 e、 g.将对象强制转换为int,而实际上它是一个字符串。您只能在运行时确定它。因此,将从中引发运行时异常 不应使用未选中的异常类型 除非经过考虑, 在范围的最外层。 这些场景通常表示 不允许恢复: 运行时异常经常反映 编程缺陷

检查过的异常需要在编译时捕获或声明为抛出,但运行时异常不需要…为什么我们只对检查过的异常重要…

查看异常的名称“RunTime”

在编译时,编译器可以准确地看到大多数代码中可能出现的错误以及错误的位置

但是,某些对象/值只能在运行时进行计算,不幸的是,编译器无法预见这一点

e、 g.将对象强制转换为int,而实际上它是一个字符串。您只能在运行时确定它。因此,将从中引发运行时异常

不应使用未选中的异常类型 除非经过考虑, 在范围的最外层。 这些场景通常表示 不允许恢复: 运行时异常经常反映 编程缺陷[19]和错误 通常表示不可恢复的JVM 失败。观点是,即使在 支持复选框的语言 例外情况是,在某些情况下 不允许使用选中的异常 适当的


清楚地提到它代表了不允许恢复的场景

看看常见的运行时异常:

  • 算术异常
  • ArrayIndexOutOfBoundsException
  • 类卡斯特例外
  • EmptyStackException
  • 非法辩论例外
  • 非法监视器状态异常
  • NullPointerException
  • 不支持操作异常

实际上,大多数异常都可能发生在任何地方,很可能是程序员的错误,因此只需要在某种bug报告处理程序中处理。其他异常显示JVM环境存在问题,需要处理,因为无法保证不会单独抛出程序。

该划分为您提供了灵活性:在考虑要抛出何种异常时,只有当应用程序能够合理地从中恢复时,才应抛出检查过的异常(例如:“无法写入文件”很少是崩溃的好理由;相反,让我们向用户显示一条消息)。运行时异常被认为是致命的(编程错误),因此最好让程序立即崩溃

这本应该是个好主意。但实际上太复杂了。核心问题是库和语言设计者应该决定什么样的错误对应用程序是致命的(当时根本不存在!)

你知道吗,虽然
1/0
导致
算术异常
1.0/0
是一个完全合法的
无穷大
?不管是明显的还是不明显的…并且应该将任意对象转换为
字符串
,但出于某种原因,它会引发未经检查的异常(
illegargumentexception
)如果要转换的对象类型错误(例如,
null
),因此在实践中,无论何时使用
格式
,都必须记住编写一个try-catch块。显然,有人认为将null转换为字符串是一个致命的编程错误。我宁愿返回一个空字符串。您的里程数可能会有所不同。JDK充满了这种奇怪的选择,它清楚地表明了在两者之间进行选择的问题n检查与未检查

这个问题使得很多人只支持未经检查的异常。我认为这很愚蠢;大多数异常都应该得到处理,因为它们表明了一些重要的事情。如果我是一名语言设计师,我会检查所有异常,但不用try-catch-block,可以使用简单的注释来表示“我不关心这个异常”(它本质上会将检查过的异常转换为运行时异常)。这将带来检查过的异常的好处(除非明确告知,否则没有什么会被忽略)和未检查过的异常的好处(周围没有大量的try-catch块)。这将是应用程序程序员决定什么是致命的,什么是预期的


当然,如果您愿意,您可以捕获运行时异常。普通的
catch(Exception ex)
可以做到这一点。

在Java中,该语言的原始发明者希望区分程序中可能发生的常见异常类型。他们提出了以下三种类型:

  • 选中的异常用于错误,这些错误可能发生在运行时,并且是预期的(某种程度上),例如,
    IOException
    。例如,在执行文件或网络I/O时,随时都可能发生错误(磁盘已满、连接丢失等)程序员必须意识到,任何调用的操作在任何时候都可能失败,因此,语言通过强制程序员对异常进行处理来强制这种意识

  • 未经检查的异常用于编程错误,例如
    NullPointerException
    IllegalArgumentException
    ,等等。这些错误通常是程序员疏忽的结果,并构成程序中的错误。它们不应该由大多数代码部分处理,因为所有关于状态的保证运行时异常的一个显著特征是,它是意外的(你并不真的认为你的程序中会有bug,对吧?--除了一般的“当然,我不会把我的生命押在这个程序没有bug上”)之外

  • 几乎不可能从中恢复的错误,例如
    OutOfMemoryError
    AssertionError
    ,等等。这些异常是非常糟糕的异常。这些异常通常不会得到处理,如果发生,将导致程序崩溃

当然,在实践中,许多应用程序将处理运行时异常(至少通过记录它们),甚至
Error
s。像Spring这样的框架往往会处理这些异常
    When you can handle the recovery of the state of Object , go for Checked Exception.
    When you cannot handle the recovery go for UnCheckedException.
    Mostly API developers go for Runtime Exception , 
   they do not want to enforce handling exception by the user, 
   since they themselves do not know how to handle it
unchecked exceptions are occurred due to poor logic of our program.so program will be terminated abnormally.but JVM will not be halted.so JVM creates Excpetion object.