Pertanyaan Java Mengembalikan Kesalahan Boolean


Saya seorang pendatang baru untuk bahasa java, dan saya bingung mengapa saya mendapatkan kesalahan di sini. Ini adalah potongan kode yang sangat pendek yang sepertinya saya punya blok mental. Ada saran?

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;
        }
    }
}

Apakah ada yang tahu apa yang saya rindukan di sini? (Ini mungkin sangat jelas).


4
2017-08-23 02:02


asal


Jawaban:


Pertama-tama, Anda lupa memiliki else ayat:

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;
  }
}

Orang lain sudah menunjukkan ini dapat dipersingkat sebagai berikut:

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);
}

(pastikan untuk menaikkan suara mereka untuk menunjukkan mereka :-)


Namun, kode Anda masih salah.

Sebagaimana dinyatakan sini, Jawa ^ operator untuk bitwise ATAU eksklusif, bukan eksponensial. Mungkin kamu mau Math.pow()?

Mengembalikan nilai dari argumen pertama yang diajukan ke kekuatan argumen kedua.

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);
}

Atau, Anda juga bisa menggunakannya Math.hypot daripada menggulirkan milikmu sendiri!

Mengembalikan sqrt (x ^ 2 + y ^ 2) tanpa overflow atau underflow menengah.

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

14
2017-08-23 02:05



Anda dapat membuat tubuh metode jauh lebih sederhana ...

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)    
    }
}

Hasil dari <= selalu Boolean.


11
2017-08-23 02:04



Anda lupa else bagian dari 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;
    }
}

Yang dapat disederhanakan menjadi:

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);
}

EDIT: Juga, sebagaimana dicatat oleh @membelok, Anda menggunakan ^2 ketika Anda harus menggunakan Math.pow, sejak ^ operator di Java adalah bitwise XOR, bukan operator daya. Jadi pergilah upvote dan menerima miliknya menjawab, karena itu adalah penyebab utama kesalahan.


9
2017-08-23 02:03



OP memiliki masalah dalam kode mereka karena adanya ^ penggunaan simbol yang harus diganti oleh Math#pow(), poin bagus semuanya! Tapi dia bertanya apa yang hilang. Jawabannya sangat sederhana: setiap metode harus mengembalikan nilai, kecuali untuk void metode.

Jika Anda memiliki

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

Compiler akan senang. Tapi, jika Anda melakukan sesuatu seperti ini:

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

Compiler akan melempar pengecualian:

Metode ini harus mengembalikan hasil tipe boolean.

Kenapa ini? Karena pada akhir metode, kompiler menemukan jalur yang tidak dapat mengembalikan nilai, jadi daripada membuat program crash atau mengembalikan hasil yang tidak diharapkan (seperti false ketika tidak ada pengembalian terkait), compiler Java akan membuang pengecualian.

Bagaimana cara mengatasinya? Mudah: jangan lupa untuk mengembalikan nilai di setiap jalur dalam metode Anda.

Cara memecahkan masalah dalam potongan kode terakhir:

  1. Menambahkan default return di akhir metode. Ini adalah pendekatan umum yang digunakan oleh hampir semua programmer.

    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. Untuk hasil boolean, Anda dapat mengembalikan suatu ketentuan:

    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);
    }
    

Tentang pengecualian dari void metode, ini tidak berarti bahwa metode void tidak dapat menggunakan return kata kunci, artinya itu harus mengembalikan "tidak ada". Untuk memposting sampel:

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
}

Jika Anda menguji metode ini menggunakan 1 dan 2 sebagai parameter, Anda akan mendapatkan hasil yang berbeda:

theVoidMethod (1):

Welcome to theVoidMethod!

theVoidMethod (2):

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

Sekarang, untuk menyelesaikan masalah lain dalam kode Anda, Anda harus menggunakan Math#powmetode bukan ^ simbol, tapi itu sangat dijelaskan dalam jawaban lainnya.


2
2017-08-23 02:24



Coba ini, saya telah menggunakan Math.pow untuk persegi. Juga ditambahkan pernyataan pengembalian untuk kondisi lain.

        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));   
     } }

2
2017-08-23 02:09



ketika kondisi itu salah, tidak mengembalikan apa pun itu sebabnya itu salah.

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
    }
}
}

0
2017-08-23 03:27