为什么我的Java是;如果;只有在Netbeans中有手表时才会触发语句?
我正在做一些与Apache Batik相关的工作(我不认为这是相关的,但你永远不知道),我遇到了一些奇怪的行为,我无法找出原因 下面的代码位正在计算一行文本的高度,因此它可以在正确的位置开始下一行:为什么我的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
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。