在发生异常之前是否完成了异常处理回滚操作?

时间:2011-06-28 04:31:50

标签: java exception exception-handling

想象一下,我有一个像这样的方法

void myMethod(MyThing t) throws MyException {
   t.foo = "bar";
   if (t.condition()) { 
      throw new MyException();
   }
}

如果触发异常,t.foo的值是否会恢复为之前的值?还是保持“条形”值?

4 个答案:

答案 0 :(得分:9)

MyThing对象上foo属性的值不会还原任何异常。

在您的示例中,没有try块,但如果有,则可以在相应的catch块中执行您自己的值回滚类型。

try {
    t.foo = "bar";
    doSomethingRiskyWhichMightThrowMyException();
} catch(MyException e) {
    t.foo = "rolledbackvalue";
}

答案 1 :(得分:3)

Throwing / catching例外不会自动暗示任何回滚操作。

如果在抛出异常之前更改了变量foo,则该值之后也将保持更改状态。

答案 2 :(得分:3)

该值不会更改为其先前的值。事实上,这就是你在catch块中要做的事情。如果发生该类型的异常,您可以重新初始化catch块中的值。尝试使用catch块可以让您执行操作,这样您就不会永远陷入陷阱。应该做什么,是否在发生此类异常时回滚,完全是程序员的决定。

答案 3 :(得分:2)

任何代码都遵循顺序模式。即First语句First等等(除非你有一些循环来重复语句或goto语句跳过或重复块)。 在您的示例中,在抛出异常之后,执行控制将转到Java的异常处理程序(因为您没有通过try-catch块编写任何异常处理代码)并最终突然结束。所以它不会在任何情况下“回溯”它的路径并返回到恢复t.foo值。它只是“条形”字符串。希望它有所帮助。