4

私はJava言語の初心者ですが、なぜここでエラーが発生するのか混乱しています。これは非常に短いコードであり、精神的な障害があるようです。助言がありますか?

public class Rigidbody {
    public boolean checkCircleCollision(float x1,float y1,float size1,float x2,float y2,float size2){
        if(Math.sqrt(((x2-x1)^2)+((y2-y1)^2))<=(size1+size2)){
            return true;
        }
    }
}

誰かが私がここで欠けているものを知っていますか?(それはおそらく本当に明白です)。

4

6 に答える 6

14

さて、最初に、あなたは条項を持っているのを忘れましたelse

public boolean checkCircleCollision(float x1, float y1, float r1,
    float x2, float y2, float r2) {
  if (Math.sqrt(((x2 - x1) ^ 2) + ((y2 - y1) ^ 2)) <= (r1 + r2)){
    return true;
  } else {
    return false;
  }
}

他の誰かがすでにこれを次のように短縮できることを指摘しました:

public boolean checkCircleCollision(float x1, float y1, float r1,
    float x2, float y2, float r2) {
  return Math.sqrt(((x2 - x1) ^ 2) + ((y2 - y1) ^ 2)) <= (r1 + r2);
}

(それらを指摘するためにそれらを賛成することを忘れないでください:-)


ただし、コードはまだ間違っています。

ここで述べたように、Javaの^演算子は、べき乗ではなく、排他的なビット単位のOR用です。たぶんあなたが欲しいMath.pow()ですか?

最初の引数の値を2番目の引数の累乗で返します。

public boolean checkCircleCollision(float x1, float y1, float r1,
    float x2, float y2, float r2) {
  return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)) <= (r1 + r2);
}

または、自分Math.hypotでロールするのではなく、単に使用することもできます!

中間のオーバーフローまたはアンダーフローなしでsqrt(x ^ 2 + y ^ 2)を返します。

public boolean checkCircleCollision(float x1, float y1, float r1,
    float x2, float y2, float r2) {
  return Math.hypot(x2 - x1, y2 - y1) <= (r1 + r2);
}
于 2012-08-23T02:05:24.143 に答える
11

メソッドの本体をはるかに単純にすることができます...

public class Rigidbody {
    public boolean checkCircleCollision(float x1,float y1,float size1,float x2,float y2,float size2){
        return Math.sqrt(((x2-x1)^2)+((y2-y1)^2))<=(size1+size2)    
    }
}

の結果<=は常にブール値です。

于 2012-08-23T02:04:06.710 に答える
9

elseの一部を忘れましたif

public boolean checkCircleCollision(float x1,float y1,float size1,float x2,float y2,float size2){
    if (Math.sqrt(Math.pow(x2-x1, 2)+ Math.pow(y2-y1,2)) <= (size1+size2)) {
        return true;
    } else {
        return false;
    }
}

これは次のように簡略化できます。

public boolean checkCircleCollision(float x1,float y1,float size1,float x2,float y2,float size2){
  return Math.sqrt(Math.pow(x2-x1, 2)+ Math.pow(y2-y1,2)) <= (size1+size2);
}

編集:また、@ veerで指摘されているように、Javaの演算子は、パワー演算子ではなくビット単位のXORであるため、^2使用する必要があるときに使用しています。それがエラーの主な原因であるため、賛成票を投じて彼の答えを受け入れてください。Math.pow^

于 2012-08-23T02:03:24.890 に答える
2

これを試してみてください、私は正方形にMath.powを使用しました。else条件のreturnステートメントも追加されました。

        public class Rigidbody {

     public boolean checkCircleCollision(float x1,float y1,float size1,float x2,float                     y2,float size2){
            return (Math.sqrt(Math.pow((x2-x1), 2) + Math.pow((y2-y1), 2)) <= (size1+size2));   
     } }
于 2012-08-23T02:09:41.043 に答える
2

^OPは、シンボルの使用法を置き換える必要があるため、コードに問題がありますMath#pow()しかし、彼/彼女はその欠けているものを尋ねています。答えは非常に簡単です。メソッドを除いて、すべてのメソッドが値を返す必要がありvoidます。

あなたが持っている場合

public boolean aBooleanMethod(int x) {
    //some fancy and nice code!
    return true;
}

コンパイラは喜ぶでしょう。しかし、あなたがこのようなことをするなら:

public boolean anotherBooleanMethod(int x) {
    if (x < 2) {
        return true;
    }
}

コンパイラは例外をスローします:

このメソッドは、ブール型の結果を返す必要があります。

どうしてこれなの?メソッドの最後で、コンパイラは値を返すことができなかったパスを見つけるため、プログラムをクラッシュさせたり、予期しない結果を返す代わりに(falsereturnが関連付けられていない場合など)、Javaコンパイラは例外をスローします。

それを解決する方法は?簡単:メソッドのすべてのパスで値を返すことを忘れないでください。

コードの最後の部分の問題を解決する方法:

  1. returnメソッドの最後にデフォルトを追加します。これは、ほとんどすべてのプログラマーが使用する一般的なアプローチです。

    public boolean anotherBooleanMethod(int x) {
        if (x < 2) {
            return true;
        }
        //if the method has never returned true, then it must return false...
        return false;
    }
    
  2. ブール結果の場合、条件を返すことができます。

    public boolean anotherBooleanMethod(int x) {
        //your method always return a value, no compiler problems
        //the value depends if x is less than 2 (true) or 2 or more (false)
        return (x < 2);
    }
    

メソッドの例外についてはvoid、これはvoidメソッドがキーワードを使用できないことを意味するのではなくreturn、単に「nothing」を返さなければならないことを意味します。サンプルを投稿するには:

public void theVoidMethod(int x) {
    System.out.println("Welcome to theVoidMethod!");
    if (x < 2) {
        //return nothing! End of the method
        return;
    }
    System.out.println("You've reached the bottom of theVoidMethod!");
    //here, the Java compiler will add a return sentence for you, no need to code it
    //return
}

1と2をパラメーターとして使用してこのメ​​ソッドをテストすると、異なる結果が得られます。

theVoidMethod(1):

Welcome to theVoidMethod!

theVoidMethod(2):

Welcome to theVoidMethod!
You've reached the bottom of theVoidMethod!

ここで、コード内の別の問題を解決するには、シンボルのMath#pow代わりにメソッドを使用する必要があります^が、それは他の回答で詳しく説明されています。

于 2012-08-23T02:24:44.200 に答える
0

その条件がfalseの場合、それは何も返さないので、それが間違っています。

public class Rigidbody {
public boolean checkCircleCollision(float x1,float y1,float size1,float x2,float y2,float size2){
    if(Math.sqrt(((x2-x1)^2)+((y2-y1)^2))<=(size1+size2)){
        return true;
    }
    else{
        return false
    }
}
}
于 2012-08-23T03:27:45.253 に答える