1

私は先週から Java を勉強しており (C# の基礎知識は持っています)、今は授業の練習をしています。この例外が発生する理由がわかりません。コードを何度も変更しようとしましたが、何も機能しません。これはコードです:

package javaapplication1;

import java.util.Scanner;

public class JavaApplication1 {
    static Scanner sc = new Scanner(System.in);
    public static void main(String[] args) {
        Competitor[] competitors;
        System.out.println("Enter number of competitors");
        competitors = Create(sc.nextInt());
        for(int i = 0;i<competitors.length - 1;i++)
            for(int j=i+1;j<competitors.length;j++)
                if(competitors[i].GetHeight()==competitors[j].GetHeight())
                    System.out.println(competitors[i]+" and "
                            +competitors[j] + "bounced to height"
                            +competitors[i].GetHeight());
    }
    static Competitor[] Create(int n) {
        Competitor[] competitors = new Competitor[n];
        for(Competitor c : competitors) {
            c = new Competitor();
            System.out.println("Enter name, id and bounce height");
            c.SetName(sc.next());
            c.SetId(sc.next());
            c.SetHeight(sc.nextFloat());
        }
        return competitors;
    }
}
class Competitor {
    private String name;
    private String id;
    private float height;
    public Competitor() {
    }
    public Competitor(String name, String id, float height) {
        this.name = name;
        this.id = id;
        this.height = height;
    }
    public String GetName() {
        return this.name;
    }
    public String GetId() {
        return this.id;
    }
    public Float GetHeight() {
        return this.height;
    }
    public void SetName(String name) {
        this.name = name;
    }
    public void SetId(String id) {
        this.id = id;
    }
    public void SetHeight(Float height) {
        this.height = height;
    }
}

この行で例外が発生します: if(competitors[i].GetHeight()==competitors[j].GetHeight())

ここで何が問題なのですか?

どうもありがとう!

4

3 に答える 3

2

Create メソッドは、競合他社の値を間違った方法で初期化します。これを試して:

    for(int i = 0;i<competitors.length;i++){
        competitors[i] = new Competitor();
        System.out.println("Enter name, id and bounce height");
        competitors[i].SetName(sc.next());
        competitors[i].SetId(sc.next());
        competitors[i].SetHeight(sc.nextFloat());
    }

もう1つの提案。C# のメソッド名は 1 つの大文字で始まりますが、Java では小文字で始まります。

于 2013-07-13T11:35:26.203 に答える
0

あなたはこれをやっています

Competitor[] competitors = new Competitor[n];
for(Competitor c : competitors) {
   c = new Competitor();
   System.out.println("Enter name, id and bounce height");
   c.SetName(sc.next());
   c.SetId(sc.next());
   c.SetHeight(sc.nextFloat());
}
return competitors;

しかし、そのように、新しい競合他社を「c」に割り当てるだけです。脱げばいいからc = new Competitor()こうなる

Competitor[] competitors = new Competitor[n];
for(Competitor c : competitors) {
   System.out.println("Enter name, id and bounce height");
   c.SetName(sc.next());
   c.SetId(sc.next());
   c.SetHeight(sc.nextFloat());
}
return competitors;

あなたの他の問題は、プリミティブ値を選択してそれを Class タイプ Float に入れていたためです(SetHeight()auto -boxing のおかげで自動的に)。クラス型は、float プリミティブをフィールドに内部的に格納します。== を使用すると、2 つのオブジェクトが比較され、フィールドが同じ値の float プリミティブを指していても、同じ場所を指していないと判断されました。SetHeight()

そのため、非プリミティブ型を比較す.equals()​​るときは、null に対してテストしようとしている場合を除き、常に == の代わりにメソッドを使用する必要があります。.equals()変数が指している場所ではなく、内部フィールドを比較するようにします。

この回答を見てください https://stackoverflow.com/a/73021/2576857

あなたが抱えていた両方の問題を理解するのに役立つと思います。

于 2013-07-13T12:17:48.817 に答える
0

この強化された for ループ:

for(Competitor c : competitors) {
    c = new Competitor();
    System.out.println("Enter name, id and bounce height");
    c.SetName(sc.next());
    c.SetId(sc.next());
    c.SetHeight(sc.nextFloat());
}

次と同等です。

for(int i = 0; i < competitors.length; i++) {
    Competitor c = competitors[i];
    c = new Competitor();
    System.out.println("Enter name, id and bounce height");
    c.SetName(sc.next());
    c.SetId(sc.next());
    c.SetHeight(sc.nextFloat());
}

を変更しましたが、変更cしたことはありませんcompetitors


Java には、C# とは異なる規則があります。ここを参照してください。

メソッドは動詞で、最初の文字が小文字で大文字と小文字が混在し、各内部単語の最初の文字が大文字である必要があります。

于 2013-07-13T11:35:52.800 に答える