【问题标题】:Eclipse debugger is jumping to the wrong return statementEclipse 调试器跳转到错误的返回语句
【发布时间】:2011-07-12 21:35:15
【问题描述】:

我遇到了一个非常奇怪的情况。我正在 Android 2.1 平台上的 Java 中(通过 Eclipse Galileo)执行以下操作:

// Get gravity & geomagnetic data to return to the caller.
final int SIZE_GRAVITY = 3, SIZE_GEOMAGNETIC = 3;
final float[] NOT_USED = null;
float[] outGravity = new float[SIZE_GRAVITY];
float[] outGeomagnetic = new float[SIZE_GEOMAGNETIC];
final String NO_DATA_COULD_BE_READ = null;
boolean succeeded = SensorManager.getRotationMatrix(NOT_USED, NOT_USED, outGravity, outGeomagnetic);
if (!succeeded)
{
    return NO_DATA_COULD_BE_READ;
}

Log.v("Test", "This should be printed - but it isn't!!");

// Prepare the data to return.
final int X = 0, Y = 1, Z = 2;
final String FIELD_SEPARATOR = ",", VECTOR_SEPARATOR = ";";
String returnValue = "" +
    outGravity[X] + FIELD_SEPARATOR +
    outGravity[Y] + FIELD_SEPARATOR +
    outGravity[Z] + VECTOR_SEPARATOR + 
    outGeomagnetic[X] + FIELD_SEPARATOR +
    outGeomagnetic[Y] + FIELD_SEPARATOR +
    outGeomagnetic[Z];

// Return data.
return returnValue;

SensorManager.getRotationMatrix(...) 返回false 时,Eclipse 调试器显示if (!succeeded) 的if 语句突然跳转到return returnValue;。不会引发异常,并且 LogCat(即使在详细模式下)也不会收到异常消息。它甚至没有收到我在代码中输入的消息。我尝试了明显的 clean-and-restart-Eclipse 方法,但没有帮助。我很困惑。

Eclipse 调试器告诉我正在调用第二条return 语句。但是,添加额外的打印语句表明第一个return 语句实际上是正在到达的语句。也许我偶然发现了一个 Eclipse 错误?或者任何人都可以解释这个异常?

【问题讨论】:

  • 当我第一次在 Eclipse 中看到这种行为时有点让我震惊,但如果执行更高的 return 语句,它有时似乎会跳到方法的底部,主要是一个烦人的视觉效果。跨度>

标签: java android eclipse debugging


【解决方案1】:

看起来succeeded 是假的。当您执行任何return 时,调试将使它看起来像方法跳转到底部return。在之前放一个日志

  return NO_DATA_COULD_BE_READ;

【讨论】:

    【解决方案2】:

    你如何确定它会跳转到最后一个return?你在 if 中有一个return,这很可能就是这个被调用的那个。

    【讨论】:

    • "你怎么确定它会跳转到最后一个返回?"好问题;我很惊讶我没有早点问自己。放置了一个打印语句并显示它确实是第一个被调用的 if 语句——尽管 Eclipse 清楚地表明它是第二个。也许这是 Eclipse 的问题?
    • here。这似乎是由于在转换 Java 字节码 → Dalvik 字节码期间进行了一些优化,合并了两个return
    • 大概就是这样。谢谢!
    • 只是为了将来的问题:return 语句不被调用,方法(或其他语言、函数、过程、子例程甚至“脚本”被调用)。一个返回语句被执行,一个变量也没有被调用,而是“引用”或读取或设置。
    • 点了。如果我要进入这个行业,我可能应该弄清楚我的术语:D
    【解决方案3】:

    我猜,你是误会了。控件没有到达最后一个return 语句,因为前面的return 语句正在执行。

     return NO_DATA_COULD_BE_READ;
    

    由于succeeded 变成false(如您所说),因此满足 if 条件,然后它只返回 NO_DATA_COULD_BE_READ 字符串的 null 值,该值位于 if-条件块。

    所以,根据观察,Log.v("Test", "This should be printed - but it isn't!!"); 永远不会到达。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 2015-04-13
      • 2013-10-06
      • 2015-05-15
      相关资源
      最近更新 更多