为什么我的Java是;如果;只有在Netbeans中有手表时才会触发语句?

为什么我的Java是;如果;只有在Netbeans中有手表时才会触发语句?,java,if-statement,netbeans,Java,If Statement,Netbeans,我正在做一些与Apache Batik相关的工作(我不认为这是相关的,但你永远不知道),我遇到了一些奇怪的行为,我无法找出原因 下面的代码位正在计算一行文本的高度,因此它可以在正确的位置开始下一行: protected double paintTextRun(TextRun textRun, double x, double y, int lineCount, EMFGraphics2D g2d) throws IOException { AttributedCharacterIte

我正在做一些与Apache Batik相关的工作(我不认为这是相关的,但你永远不知道),我遇到了一些奇怪的行为,我无法找出原因

下面的代码位正在计算一行文本的高度,因此它可以在正确的位置开始下一行:

protected double paintTextRun(TextRun textRun, double x, double y, int lineCount, EMFGraphics2D g2d) throws IOException 
{
     AttributedCharacterIterator runaci = textRun.getACI();
     char c = runaci.first();
     TextPaintInfo tpi = (TextPaintInfo) runaci.getAttribute(PAINT_INFO);
     if ( tpi == null || !tpi.visible )
     {
         return y;
     }
     setFont(runaci, g2d);
     g2d.setPaint(tpi.fillPaint);
     g2d.writeString(getTextFromACI(runaci, x, y);

     if (  runaci.getAttribute(TextAttribute.SIZE) != null )
     {
        y+= (float)runaci.getAttribute(TextAttribute.SIZE);
     }
     else if ( textRun.getLayout().getBounds2D() != null )
     {
         Double height = textRun.getLayout().getBounds2D().getHeight();
         if ( height != null )
         {
            y+=height/lineCount;
         }
    }
    return y;
    }
让我困惑的是,当我在
y+=(float)runaci.getAttribute(TextAttribute.SIZE)上放置断点时行,它永远不会被触发,条件总是落在该语句的
else
端。然而,如果我观察Netbeans中
runaci.getAttribute(texttribute.SIZE)
的值,它就不会显示为null。事实上,在
if
条件的精确语句上放置一个手表,即使代码正在进入
else
状态,也会持续计算为
true
。这很奇怪

但是,如果我在
if(runaci.getAttribute(texttribute.SIZE)!=null)
行上放置一个断点,它的计算结果为
true
,因此我进入if…else块的前半部分。取出断点,它返回到
else

这是某种奇怪的JVM优化,还是有某种评估绕过错误,而我最近有限的Java经验让我措手不及

编辑以添加:注释表明当前运行的IDE/调试器存在问题,但在重新启动计算机并清理/重建所有内容后的新一天,同样的问题会出现。

我不知道原因,但如果我将
runaci.getAttribute(texttribute.SIZE)
调用的结果指定为变量,它的行为正如人们所预料的那样

  Object textSize = runaci.getAttribute(TextAttribute.SIZE);
  if (  textSize != null )
     {
        y+= (float)textSize;
     }
     else if ( textRun.getLayout().getBounds2D() != null )
     {
         Double height = textRun.getLayout().getBounds2D().getHeight();
         if ( height != null )
         {
            y+=height/lineCount;
         }
    }

在任何情况下,以这种方式工作都可能是一个好策略-这可能是一些优化的副作用,这些优化旨在防止重复调用需要重复评估的相同方法。

我也有类似的问题,通常重新键入代码,重新启动IDE/计算机解决了这个问题。Luis有一点。我会做一个清洁和建设,看看是否行为消失。如果没有,请尝试使用日志记录而不是调试器。有时,仅仅附加调试器本身就可能会出现计时问题或其他问题。有时(buggy?)调试器也会出现这种情况。然后我回头做一些日志记录,以了解运行时发生了什么。我猜这是Swing/AWT线程与调试器截获之间的关系。也许可以检查您的toString()方法是否存在从getAttribute返回的副作用?我觉得奇怪的是,您测试它是否为null,但将它转换为float。如果它返回原语,则不应针对null进行测试;如果它返回一个对象,则不应将其强制转换为float。