2016-07-24 11 views
2

私はJavaに慣れて少しゲームを作ろうとしており、LinkedList Indexに問題がありました。私は自分の問題にパッチを当てる方法を見つけましたが、なぜ私の最初の解決策が機能していないのかまだ分かりません。このコード:ForループとLinkedListのインデックスエラー

 for (int i=0; i <= PlanetList.size(); i++) 
     { 
      g.drawImage(PlanetList.get(i).planetImage, PlanetList.get(i).xPos, PlanetList.get(i).yPos); 
     } 

は私にjava.lang.IndexOutOfBoundsExceptionが、このコードを与えた:

  for (int i=1; i <= PlanetList.size(); i++) 
     { 
      g.drawImage(PlanetList.get(i-1).planetImage, PlanetList.get(i-1).xPos, PlanetList.get(i-1).yPos); 
     } 

ものは、両方の場合には0で...私のインデックススタートです。なぜ最初のものが私にエラーを与えるのですか?

+2

サイトの注意:Javaコーディングスタイルのガイドを調べてください。変数名は小文字で始まります。そして:あなたの変数名にコレクションのタイプを入れないでください。たぶん "planateList"は今日のリストです - それは明日何か別のものかもしれません。なぜあなたはそれを「惑星」と呼んでいないのですか?それは "それ以上のもの"についてあなたに伝えます。リストのアスペクトを「修正」することは避けます。 – GhostCat

答えて

5

最初の例の最後のインデックスは、許可されたインデックスの範囲を超えています。例えば、リストのサイズが10である場合、許容されるインデックス範囲は[0 9]である。最初のループでは、最大10(i <= PlanetList.size())になります。端末の状態をi < PlanetList.size()に変更して問題を解決してください。

代替は@GhostCatを示唆しているとして、あなたのリストの要素にアクセスするには、noインデックスを使用しないことです。

for (Planet planet : PlanetList) { 
    g.drawImage(planet.planetImage, planet.xPos, planet.yPos); 
} 

これは、Java

3

for-each loop他のソリューションは、単にindex-を使用することであると呼ばれています年前に導入された「コレクション」を反復する無料版:また、コードの重複股関節を排除素敵な副作用として、

for (Planet planet : PlanetList) { 
    g.drawImage(planet.planetImage, planet.xPos, planet.yPos); 

あなたがあなたの例にあったものです。

私たちがいる間、あなたは何らかの形で "tell dont ask"の原則に違反しています。意味:あなたはです。あなたの惑星オブジェクトに描画する必要があるすべての詳細を与えるように頼んでください。オブジェクト指向の優れた設計では、それを避けることができます。代わりに、オブジェクトに何かをさせるようにしてください。言い換えれば、あなたはそれで

public void drawWith(Graphics g) { ... 

にあなたの惑星のクラスを変えることができるよう、上記のコードを書き換えることができます:変数iがで宣言されたので、あなたが境界エラーのアウトを取得している

for (Planet planet : ...) { 
    planet.drawWith(g); 
0

forループはplanetlistサイズの条件に等しいかそれよりも少なく実行されますが、ゼロから始まるのはリンクされたリストのサイズまで移動しますが、それよりも小さいと指定したのでループに1回以上移動します。 forループの条件をiに設定すると、リンクされたリストのサイズより小さくなります。

+1

ヒント:短い文章を試してみてください。長い文章が句読点なしで3行を超えるのを避けると、読みやすく理解しやすくなります。そして、あなたが知っていることは、コードのほんの一部が理解しやすくなることもあります。そして最後に、他の人と同じ答えを与えようとしていますが、単にコードの代わりに "言語"を使って違うようにしているだけで、あなたにはあまり評判がありません。 Vite Falconの回答と比べて、あなたはちょうど、申し訳ありませんが、吸う。 – GhostCat