为什么 Java 中的强制类型转换异常是致命的?

问题描述 投票:0回答:3

根据this文章:

与静态类型检查相反,动态类型检查可能会导致程序在运行时由于类型错误而失败。在某些编程语言中,可以通过错误处理或较差的类型安全性来预测这些故障并从中恢复。在其他情况下,类型检查错误被认为是致命的。

Java 就是一个类型检查错误是致命的例子。为什么 Java(也许是大多数静态类型语言)如此严格,以至于如果发生类型错误,它会在运行时失败?假设您将对象 A(实际类型

int
)向上转换为类型
Object
,然后向下转换为
String
。编译时检查将通过,但运行时类型检查将失败并出现致命异常。这看起来很严酷,因为它不像
illegalArgumentException
,程序实际上不能继续(无效的强制转换会失去类型安全性,但不应该是不可能的)。在我看来,最理想的情况是抛出警告,然后在尝试调用整数对象上的
String
方法
indexOf
时致命失败。当尝试执行此无效转换时,Java 实际上无法在运行时继续进行,是否有原因?

java oop
3个回答
6
投票

Java 就是一个类型检查错误是致命的例子。

不,不是。你可以抓住他们。

为什么 Java(也许是大多数静态类型语言)如此严格,如果发生类型错误,它会在运行时失败?

因为这就是“静态类型”的意思;同上“严格打字”。

假设您将对象 A(实际类型 int)向上转换为 Object 类型,然后向下转换为 String。编译时检查将通过,但运行时类型检查将失败并出现致命异常。

不,不会。它将失败并显示

ClassCastException.

这看起来很严酷,因为它不像非法参数异常,程序实际上无法继续(无效的转换会失去类型安全性,但不应该是不可能的)。

但这是不可能的。演员阵容无法继续进行。生成目标代码的方式假设如此。

在我看来,最好的情况是发出警告

它抛出一个

ClassCastException.

然后,如果尝试调用整数对象上的 String 方法 indexOf,则会致命失败。

嗯,它不会那样做。

当尝试执行此无效转换时,Java 实际上无法在运行时继续进行,是否有原因?

实现是围绕异常发生这一事实来设计的。


2
投票

它不是那样做的,因为你的建议没有任何好处。

如果您的代码可以在这些情况下继续工作,那么您的代码就是糟糕且多余的,因为强制转换并不是真正必要的,因为您没有对该类型执行任何特定操作。

通常语言的设计并不是为了迎合不必要的代码。

有很多缺点,最明显的是性能:不可能用执行您所描述的语言有效地编译为机器代码。

静态类型语言通常比动态类型语言更快,因为预先了解类型可以实现许多原本不可能实现的优化。

您的任何建议都会使语言动态类型化。


1
投票

我认为原因是为了保证程序员能够定位问题并修复它,保证软件是正确的。如果您在取消引用之前忽略转换问题,则可能会因为太远而无法轻松追溯。

© www.soinside.com 2019 - 2024. All rights reserved.