ColdFusionカフェテリア
SAMURAIZ
| ↑一覧へ戻る |
ColdFusionクリニックへようこそ
次のモヤモヤされている方どうぞ〜

「変数同士」や「変数と文字列」をつなげて新しい変数を作ろうとしたらエラーになって。。。

作成日: 2015年8月
最終更新日: 2015年8月

それではどのようなエラーになったのか見てみましょう。ふむふむ。1つ目は苗字と名前が保存された2つの変数をつなげようとしていて、2つ目は挨拶文に苗字の変数を入れようとしたらそれぞれエラーになったのですね。

エラー@ (無効な CFML construct)
<cfset LastName="サムライズ">
<cfset FirstName="太郎">
<cfset FullName=Variables.LastName Variables.FirstName>
<cfoutput>#FullName#</cfoutput>
次の情報は、Web サイト開発者のデバッグに役立ちます。
リクエストを処理する際に、エラーが発生しました。

列 36、行 3 で、無効な CFML construct が見つかりました。

以下のテキストを見ていました :

Variables.FirstName

CFML コンパイラが処理中でした :

  • 列 2、行 3 から始まる cfset tag 。
エラーの発生位置 C:/ColdFusion11/cfusion/wwwroot/local_link/variables/004_Variables_combine.cfm: line 3
1 : <cfset LastName="サムライズ">
2 : <cfset FirstName="太郎">
3 : <cfset FullName=Variables.LastName Variables.FirstName>
4 : <cfoutput>#FullName#</cfoutput>
スタックトレース
coldfusion.compiler.ParseException: 列 36、行 3 で、無効な CFML construct が見つかりました。
	at coldfusion.compiler.cfml40.generateParseException(cfml40.java:13795)
	at coldfusion.compiler.cfml40.jj_consume_token(cfml40.java:13666)
	at coldfusion.compiler.cfml40.endOrEmptyTag(cfml40.java:420)
	at coldfusion.compiler.cfml40.cfset(cfml40.java:478)
	at coldfusion.compiler.cfml40.cfml(cfml40.java:4726)
	at coldfusion.compiler.cfml40.start(cfml40.java:5178)
	at coldfusion.compiler.NeoTranslator.parsePage(NeoTranslator.java:620)
	at coldfusion.compiler.NeoTranslator.parsePage(NeoTranslator.java:601)
	at coldfusion.compiler.NeoTranslator.parseAndTransform(NeoTranslator.java:441)
	at coldfusion.compiler.NeoTranslator.translateJava(NeoTranslator.java:391)
	at coldfusion.compiler.NeoTranslator.translateJava(NeoTranslator.java:160)
	at coldfusion.runtime.TemplateClassLoader$TemplateCache$1.fetch(TemplateClassLoader.java:461)
	at coldfusion.util.LruCache.get(LruCache.java:180)
エラーA (数値に変換できません)
<cfset LastName="サムライズ">

<cfset Message=Variables.LastName+"さん、こんにちは!">
<cfoutput>#Message#</cfoutput>
次の情報は、Web サイト開発者のデバッグに役立ちます。
リクエストを処理する際に、エラーが発生しました。

値 サムライズ を数値に変換できません。

エラーの発生位置 C:/ColdFusion11/cfusion/wwwroot/local_link/variables/004_Variables_combine.cfm: line 3
1 : <cfset LastName="サムライズ">
2 : 
3 : <cfset Message=Variables.LastName+"さん、こんにちは!">
4 : <cfoutput>#Message#</cfoutput>
スタックトレース
at cf004_Variables_combine2ecfm205191890.runPage(C:/ColdFusion11/cfusion/wwwroot/local_link/variables/004_Variables_combine.cfm:3)
coldfusion.runtime.Cast$NumberConversionException: 値 サムライズ を数値に変換できません。
	at coldfusion.runtime.Cast._double(Cast.java:850)
	at coldfusion.runtime.Cast._double(Cast.java:710)
	at coldfusion.runtime.Cast._double(Cast.java:878)
	at coldfusion.runtime.Cast._double(Cast.java:868)
	at cf004_Variables_combine2ecfm205191890.runPage(C:\ColdFusion11\cfusion\wwwroot\local_link\variables\004_Variables_combine.cfm:3)
	at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:246)
	at coldfusion.tagext.lang.IncludeTag.handlePageInvoke(IncludeTag.java:736)
	at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:572)

■検診の結果

エラー@、Aのどちらも3行目で正しい連結文字を入れていないのでエラーが発生しています。

エラー@は、変数と変数の間にスペースを入れていますが、スペースはCFタグで、タグや属性とを区別するのに使用します(<cfoutput query="qTemp" group="id">のようにスペースでタグ名とquery属性・group属性を区切っています)。変数同士の連結文字としては使用できず、無効なCFML construct(構文)エラーになってしまったのです。

エラーAは、変数と文字列の間に連結文字として “+” を使っています。他のプログラム言語では、値が文字列であれば “+” で連結できるものもありますが、ColdFusionでこの文字を使用すると、計算処理として認識し、前と後ろの値を(たとえ文字列だろうと)計算してしまいます。今回の場合、もちろん苗字の変数に入っているのは文字列ですので、数字に変換できないエラーになってしまいました。

■治療法は?

ColdFusionで変数と変数(または文字列)の連携文字は“&(半角のアンドマーク)”です。エラーが発生している3行目の区切り箇所に&マークを指定する事で、前と後ろをつなげ、適切に処理を行います。

エラー@
<cfset FullName=Variables.LastName & Variables.FirstName>
エラーA
<cfset Message=Variables.LastName & "さん、こんにちは!">

■今後の予防

ColdFusionでは、変数を作成する際にデータ型(文字列・数値・ブール値・複合データ・オブジェクト など)を指定しません。しかし実際には、変数の値には型があり、計算処理や関数で使用する際に、自動的に適切な型に変換されます。

誤った連結文字を指定しないように気をつけてプログラミングして下さい。また、エラーが発生した時は、そのメッセージを確認して、予期しない型の変換が行われていないかも注意しましょう。

もう一点。エラー@の FullName のセット方法だと、苗字と名前がくっついてしまいます。空白を入れたい時はどうすれば良いでしょうか?

答えは、変数 & 空白の文字列 & 変数と指定することです。要は文字列としてスペースを追加すれば良いです。
<cfset FullName=Variables.LastName & " " & Variables.FirstName>

■おくすり出しておきますね〜(まめ知識)

 

連結文字を使わない方法としては、変数の値を文字列としてセットし、そこに変数の呼び出しを埋め込みます。

エラー@
<cfset FullName="#Variables.LastName##Variables.FirstName#">
エラーA
<cfset Message="#Variables.LastName#さん、こんにちは!">

連結文字を使わない分、こちらの方がコードが見やすい場合もありますが、逆の言い方をすると、「文字列」と「変数の参照」の区別がつきにくいプログラムになります。どちらが良いかは判断に悩む部分がありますが、両方の書き方が混在しないよう、(なるべく)どちらかに統一してプログラムされる事をお勧めします。

お大事に〜
ColdFusionの各種情報の配信


最新情報
■2017/3/27
ColdFusion 2016 対応
インストール セットアップ情報
CFサーバーのインストール
CFビルダーのインストール

■2016/9/20
『ColdFusion 2016 リリース
Enterprise Edition 活用資料』
記事一覧

■2016/3/30
『ColdFusion 実験室』
実験4、実験5

■2015/8/10 〜
『ColdFusion クリニック』
記事一覧(随時更新中)

■2015/4/8
『JasperReportsによる帳票出力』
2. JasperReportsによる帳票出力【後編】

■2015/3/12
アップクロス株式会社
西元 貞昭様
『JasperReportsによる帳票出力』
1. JasperReportsによる帳票出力【前編】


■2015/2/25
『ColdFusionでエクセルを使いこなそう!』
4. 【上級】ColdFusionのエクセル機能を利用したPDF帳票の紹介

ColdFusionトレーニング


ColdFusionユーザーグループ
ColdFusionユーザーグループ
Copyright 2012 Samuraiz Corporation. All Rights Reserved.