coldfusion imageDraw java.lang.Double не может быть приведен к java.lang.String

Я работаю с 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


person mrsBurnside    schedule 04.07.2019    source источник
comment
Какие фактические значения вызывают эту ошибку? Трудно сказать, так как в примере отсутствуют переменные (lineHeight, dpi и т. д.). Не могли бы вы обновить его и превратить в минимально воспроизводимый пример?   -  person SOS    schedule 04.07.2019
comment
FWIW, я не смог воспроизвести вашу ошибку с CF2016 или 2018, что предполагает использование конкретных значений. Вот почему было бы полезно привести полный пример, который воспроизводит проблему - для следующего человека, который столкнется с той же проблемой :-)   -  person SOS    schedule 04.07.2019


Ответы (2)


Это ошибка в более старых версиях 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).

(Этот пост больше похож на замечание, но слишком длинный для комментария. Не стесняйтесь принимать свой собственный ответ.)

person Alex    schedule 04.07.2019
comment
(редактировать) .. подал новый отчет об ошибке, на всякий случай tracker.adobe.com/ #/представление/CF-4204709 - person SOS; 05.07.2019

Есть что-то в том, чтобы просить о помощи, что открывает для меня каналы. Нашел решение. Проблема действительно заключалась в части setup.size коллекции атрибутов. Вот что сработало:

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

Не знаю, почему он хочет, чтобы это была именно строка. Кажется глупым, потому что мы используем его как число.

person mrsBurnside    schedule 04.07.2019