AnyLogic でエラーを修正する方法について、このブログ投稿を、ご利用ください。
このブログは最新のウェビナーに基づいて構成されており、すべてのユーザーに利用可能な活用事例です。
なお、プログラムの一時停止と再開、変数の検査、式の評価等の操作を可能にするには、AnyLogic の Debug モードを使用しますが、これは AnyLogic Professional でのみ使用でき、主にコードの多いモデルの際に役立ちます。
このブログ投稿の内容は次のとおりです。
- モデルナビゲーション
- コンパイル時エラー
- Cannot be resolved
- The method is not applicable
- Type mismatch
- Syntax error
- Unreachable code
- The method is undefined
- Statechart specific errors
- 実行時エラー
モデルナビゲーション
AnyLogic を初めて使用する場合は、覚えておくべきインターフェイスの重要な要素がいくつかあります。
上部にはメニューとツールバーがあります。左から右に、4 つのセクションがあります。
- Projects ビュー – 開いているすべてのモデルが表示されます。初心者の場合、混乱を避けるために、一度に 1 つのモデルのみを開いた方がよい場合があります。
- Palette ビュー – AnyLogic ライブラリの要素、プレゼンテーションの要素、およびモデル構築のためのその他のツールが含まれています。
- Graphical エディタまたは Canvas – Palette ビューから要素をドラッグアンドドロップして、モデルのロジックとモデルの物理的表現の両方を作成するスペースです。
- Properties ビュー – モデルで選択した要素のプロパティが表示されます。
Projects セクションでは、モデルの要素がさまざまなカテゴリに分類されているため、それらを簡単にナビゲートできます。エージェントを Graphical エディタで開くには、エージェントをダブルクリックします。新しいタブとして表示され、Projects ビューでは太字で強調表示されるため、モデル内のどこを参照しているのかが常にわかります。
下部にはステータス バーと 2 つのウィンドウ (ConsoleとProblems) が表示されます。これら 2 つの要素は、エラーメッセージの処理に役立つため、このブログ投稿の焦点となります。
モデル要素の検索
エージェントではなく、 Canvas 上でそのエージェントに属する特定の要素を検索したいとします。Canvas に何も開かれていない状態から要素をダブルクリックすると、対応するエージェントが開きます。2 回目のダブルクリックで、そのエージェント内で検索された要素が強調表示されます。
要素を検索するもう 1 つの方法は、検索ボタン (Windows の場合は Ctrl + F、Mac の場合は Command + Fでも可能) を使用することです。
これらは、エラーや問題のある要素を扱うときに必要となるモデル内の要素を見つける方法です。
コンパイル時エラー
これらはコードの生成とコンパイル中に検出され、モデルを実行する前に表示されます。このようなエラーは、Problems ビューに表示されます。
モデル構築プロセスを進めるときに、いつでも Build model (または F7) を押すと、プロジェクト内のすべてのモデルのエラーを見つけることができます。エラーがある場合は、モデルのアイコンの近くに小さな赤い X が表示されます。
AnyLogic で画面の下部にある Problems セクションを開いて、検出されたすべてのエラーを確認します。それらをフィルタリングするには、モデル別に問題をフィルタリングする (Filter problems by model をクリックしてから Projects ビューのモデルを選択) か、選択毎に問題をフィルタリングする (Filter problems by selection をクリックしてから Projects ビューのエージェントを選択) のいずれかを使用します。
ウェビナーのサンプルモデルに登場したコンパイルの問題を見てみましょう。
コンパイル時エラー1: "[NAME] cannot be resolved… (…to a variable/…or is not a field)"
このメッセージは次のいずれかを意味する可能性があります。
- 参照した名前に問題があるため、AnyLogic がそれを処理できません。通常、リファクタリングを行わずにオブジェクトのスペルを間違えたり、名前を変更したりすることが原因で発生します。
- オブジェクトのタイプが指定されていない。
このエラーに対処するためのいくつかのシナリオを次に示します。
名前解決(Name resolution): 参照された要素の名前が間違っています
このエラーは、参照されている Population の名前に問題があることを示しています。モデラーの意図は、Source ブロックが Customers と呼ばれるエージェントの Population を参照することです。したがって、ここでは mypopulation を削除し、ドロップダウン メニューから提案された Population 名である Customers を選択するだけです。
Nここでもう一度 Build model (または F7) を押すと、エラーが解決したことがわかります。Error demo – name resolution のサンプル [ZIP] を使用して、これをお試しください。
名前解決(Name resolution): スペルミス
スペルミスは、見つけるのが最も難しいものの 1 つです。一見するとタイプミスがないように見える場合もありますが、正しく入力するためのコツがあります。
ここでのモデラーの意図は、エージェントがフローチャートの実行に費やした時間をヒストグラムに追加することでした。ただし、AnyLogic はコード内の名前を解決できません。
確実な名前の部分をそのままにして、コード補完 (Ctrl + Space または Option + Space) を呼び出し、候補から適切なオプションを選択することができます。
ここでもう一度 Build model (または F7) を押すと、エラーが解決したことがわかります。 Error demo – name resolutionのサンプル [ZIP] を使用して、お試しください。
名前解決(Name resolution): コード補完に表示されません
エラーをたどると、それは名前の間違いを示しているため、コード補完を呼び出しますが、適切なオプションは表示されません。必要な要素が Canvas 上に表示されていても、コード補完には表示されない場合は、その要素が Ignore としてマークされていないことを確認してください。
Ignore オプションのチェックを外し、Build model (または F7) を押して、エラーが解決されたかどうかを確認します。Error demo – name resolution のサンプル [ZIP] を使用して、これをお試しください。
名前フィールドの解決(Name field resolution): パラメータの名前が間違っています
このエラーは、Task priority:_priority_value の名前が正しくないことを示しています。これはエージェントを指しており、そのエージェントは Customer であるため、Customer エージェントの要素でソリューションを探す必要があります。
Priority_level というパラメータがあることがわかり、それが探していたものです。Task priority パラメータの名前を変更し、 Build model (または F7) を押して、エラーが解消されたかどうかを確認します。Error demo – name field resolution のサンプル [ZIP] を使用して、これをお試しください。
名前フィールドの解決(Name field resolution): オブジェクト タイプが指定されていません
Unit は、employeePool というリソース ユニットを指します。Employee エージェントで skill_rating という要素を探すと、そこにそれが表示されるため、問題は前の例のような名前付けではありません。
エラーが見つかった Seize ブロックでは、参照するユニット (エージェント) のタイプを指定する必要があります。まず、特定のユニット (Employee)unit をキャストする必要があります。次に、skill_rating がオブジェクト全体に属していることを AnyLogic に知らせる必要があります。((Employee)unit).skill_rating
Error demo – name field resolution のサンプル [ZIP] を使用して、これをお試しください。
コンパイル時エラー2: "The method [FUNCTION(ARG)] in the type [OBJECT_TYPE] is not applicable for the arguments [(ARG)]"
このようなエラーは、メソッドまたは関数に渡す引数が指定されたものと一致しない場合に発生します。
ユーザーは2つの引数の型を double に設定しましたが、 Delay ブロックでは値を 1 つだけ渡しました。したがって、2 番目の値を追加すると問題は解決します。
Error demo – name field resolution のサンプル [ZIP] を使用して、これをお試しください。
コンパイル時エラー3: "Type mismatch: cannot convert from [TYPE_A] to [TYPE_B]"
モデル内に不正な型の変数がある場合、このエラーが発生します。
サンプルモデルでは、問題は SelectOutput ブロックの Condition にあります。Customer エージェントの要素にも問題があります。ここでわかるのは、Type が Double に設定されているのに対し、SelectOutput ブロックの Condition フィールドでは Boolean である必要があるということです。Type を Boolean に設定に変更すれば、問題は解決します。
Error demo – type mismatch のサンプル[ZIP] を使用して、これをお試しください。
コンパイル時エラー4: "Syntax error, [MESSAGE]"
これらのメッセージは非常に単純です。最も一般的なメッセージとその解決方法を見てみましょう。
- Syntax error on token ")", delete this token は、削除する必要がある余分な文字があることを意味します。
- Syntax error, insert ")" to complete Expression 式に文字が足りません。式は、1 つの変数として評価される変数、演算子、関数の組み合わせです。例: 2 * (3 + 4) は、ステートメント int result = 2 * (3 + 4); 内の式になります。
- Syntax error, insert ";" to complete Statement ステートメント内の文字が欠落しています。ステートメントは、Java における完全な実行単位です。アクションを実行したり、状態を変更したりできます。例: int age = 25;
- Syntax error, insert "}" to complete BlockStatements ブロックステートメントに欠落している文字があります。ブロック ステートメントは、中括弧 {} で囲まれたステートメントのグループです。
コンパイル時エラー5: "Unreachable code"
このエラーが表示された場合は、構文の終了後 (たとえば、セミコロン ";" の後ろ) にコードがあります。
コンパイル時エラー6: "The method [FUNCTION_NAME] is undefined for the type [OBJECT_TYPE]"
このエラーも非常に単純です。これは、特定のオブジェクト タイプに存在しない関数を呼び出しているために発生する可能性があります。通常、タイプミスが原因で発生します。
コンパイル時エラー7: compilation errors that are specific to statecharts
ステートチャートでは従わなければならない特定の論理ルールがあります。この点に関して発生する最も一般的なエラーは次のとおりです。
- Hanging statechart entry エントリ ポイントは何にも接続されていませんが、Palette ビューから State を追加すると、エラーは解消されます。
- Branch state without outgoing transitions は、Branch から別の要素を指す新しい Transition を加える必要があります。
実行時エラー
これらはモデルの実行中に発生し、Java 関連または論理的なものです。このようなエラーの詳細は Console に表示されます。
実行時エラー1: "Agent cannot leave port [NAME], it has no connections"
このシミュレーション ロジック エラーは、離散イベント フローチャートに関連しています。
この場合、"Agent cannot leave port root.shortDelay.out" というメッセージが表示されるため、Delay ブロックまたは Sink ブロックを追加する必要があります。Error demo – no port connections のサンプル[ZIP] を使用して、これをお試しください。
実行時エラー2: "An agent was not able to leave the port [NAME] at time [TIMESTAMP]/ date [DATESTAMP]"
これもシミュレーション ロジックとフローチャートに関連するエラーです。通常、後続のブロックのキャパシティに達した場合に、Source ブロックが原因で発生します。
対策としては、手動でキャパシティを増やすか、Pull プロトコルを使用することです。Error demo – leave port のサンプル [ZIP] を使用して、これをお試しください。
実行時エラー3: "[TYPE_A] cannot be cast to [TYPE_B]"
実行時の型と互換性のない型にエージェントをキャストしようとしたときにトリガーされる Java コードエラー。
モデルに EmployeePrimary と EmployeeBackup という 2 つのエージェントタイプがあるとします。これらのために、Main には 2 つのリソース プールがあります。
しかし、モデルを実行すると、バックアップ従業員(EmployeeBackup)をプライマリ従業員(EmployeePrimary)に変換しようとするため、エラーが発生します。ここでの解決策は、モデルにユニットの実際のクラスをチェックさせることです。Seize ブロックの Unit rating に条件を追加します。
Error demo – incorrect casting のサンプル [ZIP] でこれをお試しください。
実行時エラー4: "NullPointerException"
これは、null 値に対して直接操作を実行しようとするとトリガーされます ("null" は値の欠如を示す Java キーワードです)。
Error demo – null pointer のサンプル[ZIP] を参照してください。
実行時エラー5: "IndexOutOfBoundsException"
これは、コレクションのサイズに基づいて無効なインデックスでコレクション (配列やリストなど) にアクセスしようとすると発生します。正しいインデックスは 0 未満であっても、コレクションのサイズを超えてもいけません。
Error demo – index out of bounds のサンプル [ZIP] でインデックスを試してみることができます。
結論
ここでは、AnyLogic でモデルの構築を開始するときに発生する可能性のある最も一般的なコンパイル時エラーと実行時エラーのいくつかについて説明しました。このブログ投稿で強調されているアドバイスを活用して、より複雑な問題にご自身で対処することができます。AnyLogic Help: Troubleshooting で回答とヒントを検索することもできます。
また、StackOverflow の AnyLogic コミュニティからいつでもサポートを受けることができます。
毎月のニュースレターを購読していただくと、最新のブログ投稿をお届けします。