1

我正在使用imageDraw并遇到一个奇怪的错误。如果我只是插入值并且不尝试使用我从其他地方检索的值,它可以工作,但我必须从其他地方绘制边距和行高的值并计算东西。

 x = 50;
 y = 800;
 newImg = imageNew("", x, y);
 imageSetAntialiasing(newImg, true);
 setup['size'] = lineHeight*dpi;
 setup['font'] = "Arial";
 imageDrawText(newImg,img.text,topMargin,leftMargin,setup);

当我将 imageDrawText 中的每个元素放在单独的行上时,错误指向属性集合(设置)。我确实试过这个

setup['size'] = "#lineHeight*dpi#";

但它也没有用。

调试顶部的完整错误消息:

处理请求时发生错误

java.lang.Double将类型的对象强制转换为不java.lang.String兼容的类型时出错。这通常表示 Java 中的编程错误,尽管它也可能意味着您尝试以与设计不同的方式使用外来对象。java.lang.Double不能转换为java.lang.String

4

2 回答 2

4

这是较旧的 ColdFusion 版本(在 ColdFusion 2016 之前)中的一个错误,因为该size属性是显式转换的:(String)size. 即使您将值作为字符串传递,您的值也可能不包含小数位,因为 ColdFusion 会尝试将值解析为整数:Integer.parseInt((String)size)

// works
setup['size'] = "12";

// works, because literal numbers are casted to String
setup['size'] = 12;

// DOES NOT work, because any math calculation results into a Double
setup['size'] = 12 * 1;

// DOES NOT work, because this is a Double
setup['size'] = 12.1;

您使用setup['size'] = toString(int(...));的解决方案是此错误的正确解决方法。int()确保您最终没有小数位(防止 NumberFormatException)并toString()确保您传递了一个字符串(防止 ClassCastException)。

(这篇文章更像是一个评论,但评论太长了。随意接受你自己的答案。)

于 2019-07-04T21:45:29.750 回答
1

寻求帮助可以为我打开渠道。找到了解决方案。问题确实是属性集合的 setup.size 部分。这是有效的:

setup['size'] = toString(int(lineHeight*dpi));

不知道为什么它希望它专门成为一个字符串。似乎有点愚蠢,因为我们将其用作数字。

于 2019-07-04T18:42:12.533 回答