当前位置: 首页 > 面试题库 >

Java:捕获的含义(最终SomeException e)?

曾嘉福
2023-03-14
问题内容

final在以下Java表达式中做什么?

catch (final SomeExceptionType e)

问题答案:

它基本上意味着:

将“ SomeExceptionType”捕获到变量“ e”中,并保证在处理异常期间不会为“ e”分配其他异常。

通常,这太过分了,好像我将一个异常捕获到一个临时变量名称中(e仅对异常处理块有效),我不必太严厉地监管自己以至于不信任自己来分配其他变量(可能会创建)相同变量名的异常。

就是说,这个障碍可能是由一群不同想法的团队高度维护的,一个人只是想非常确定e是最初捕获的异常。

-—根据评论进行编辑----

我想不出这样做的绝佳理由。由于“ e”不是成员(静态或其他),因此类文件在编译后将不使用名称“
e”。另一种说明方式是,当您输入JVM字节码的异常处理块时,该对象将不会分配给JVM处理框架可访问的任何成员名称,它将被推送到线程的内部处理堆栈中。当前帧。

即使两个线程可以访问同一对象,每个线程也将拥有自己的框架,因此编译器从一个框架的内部堆栈中删除了“ e”名称,而另一线程无法更改该名称。

考虑到这一点,声明“ e”为final的唯一好处是确保将来的编码人员在进入该代码块后不会意外地将其设置为“
e”。也许它们的目的是使代码在多线程环境中更健壮,但是临时变量(名称仅在块中有效的变量)在编译后没有名称,因此将它们压入框架的堆栈中。

这就是为什么

public int safe() {
  int x = 5;
  x = x + 5;
  return x;
}

通常被认为是线程安全的,因为它这样做(用伪字节码)

(In the thread's current frame)
push 5
push 5
add integers
return

虽然这不是线程安全的

int x = 5;

public void unsafe() {
  x = 5;
  x = x + 5;
  return x;
}

因为这样做

(in the thread's current frame)
push "this"
push 5
set member x
push "this"
get member x
push 5
add integer
set member x
get member x
return

后一个字节码清楚地表明,交织两个线程使用成员x a中介创建线程到线程通信,而第一段代码不能进行任何线程间通信,因为没有中介。



 类似资料:
  • 我正在查看Java SE7的新功能,目前我正在: http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html 关于捕获多重功能,当我遇到这个语句时: 注意:如果一个捕捉块处理多个异常类型,那么捕捉参数是隐式最终的。在这个例子中,捕捉参数ex是最终的,因此您不能在捕捉块中给它赋值。 我从未注意到

  • 问题内容: 我正在检查Java SE7的新功能,目前我正在: http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch- multiple.html 关于捕获多个功能,当我遇到以下语句时: 注意:如果catch块处理多个异常类型,则catch参数隐式为final。在此示例中,catch参数ex是最终的,因此您不能在ca

  • 问题内容: 我有一个需要类似以下内容的场景 在我的尝试,我会,数据,将其与基于处理其他数据集。 在随后。有可能阻止吗?下面是伪代码: 问题答案: 无需创建表,您只需声明一个表变量(查询结束时该变量将自动消失)。

  • 问题内容: 我经常遇到如下情况: 仍然需要尝试-最终在内部捕获块。 克服此问题的最佳实践是什么? 问题答案: 写一个类,其中包含捕获和记录此类异常的方法,然后根据需要使用。 您最终会看到如下内容: 您的客户端代码将类似于: 更新: 自Java 7开始,各种JDBC接口都得到了扩展,而以上代码回答了原始问题,如果您直接针对JDBC API编写代码,则现在可以对其进行结构化:

  • 问题内容: 在进行学校项目时,我编写了以下代码: 问题在于Netbeans告诉我这些行抛出一个,因此必须被捕获或声明。它还抱怨并且可能尚未初始化(尽管检查为空)。 似乎整个问题都在此停了下来,这似乎有些奇怪。 我的下意识解决方法是这样做: 但是,这深深地困扰着我,让我感到肮脏。 我来自C#背景,我只是在这里利用块,因此我不确定处理此问题的“正确”方法是什么。 解决这个问题的正确方法 是 什么? 问

  • 问题内容: 请参见以下代码,并解释输出行为。 结果是返回Val:10。 Eclipse显示警告:。 catch块中的return语句会怎样? 问题答案: 它被中的一个覆盖,因为它在所有其他操作之后执行。 这就是为什么,经验法则- 永不从回归。例如,Eclipse显示了该代码段的警告:“最终阻止无法正常完成”