JAVA Saya tidak mengerti Coba tangkap

Ini adalah pertama kali saya di sini. Saya mulai belajar cara membuat kode, jadi sejujurnya saya berharap pertanyaan yang saya ajukan ini bukanlah sesuatu yang dapat saya temukan di sini! (Saya berjanji saya mencarinya sebentar, tetapi karena saya pemula dalam topik ini, saya tidak menemukan sesuatu yang dapat saya pahami untuk mengatasi keraguan saya).

Saya sedang melakukan permainan sederhana di JAVA, di mana program menghasilkan angka acak dan pemain harus menebak angka yang dihasilkan. Saat pemain memasukkan sebuah angka, permainan akan menampilkan petunjuk yang menyatakan apakah angka tersebut lebih tinggi atau lebih rendah dari angka yang dihasilkan secara acak.

Program itu sendiri berfungsi dengan baik jika Anda memasukkan angka saja, tetapi saya ingin menambahkan pernyataan coba-tangkap untuk menangani masukan pengguna yang buruk.

Saya mencoba menggunakan pernyataan seperti yang saya tunjukkan dalam kode saya, tetapi saya tidak mengerti mengapa itu tidak berfungsi dengan benar, karena ketika saya memasukkan angka yang berbeda, pengecualian ditangkap dan dicetak di konsol System.out.println( ), namun program berakhir ketika hal ini terjadi.

Saya ingin mencoba menangkap hanya untuk mendapatkan pengecualian dengan memasukkan bukan angka tanpa menghentikan program setiap kali pengecualian ditangkap. Bagaimana cara memperbaikinya?

Terima kasih banyak atas bantuan Anda!

import java.util.Scanner;

public class HiLo {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);  //Creates Scanner object to read from keyboard
        String playAgain = "";  //if == y, game restarts
        try {
            do {
                // Create a random number for the user to guess
                int theNumber = (int)(Math.random() * 100 + 1);
                //System.out.println(theNumber);        //Uncoment this in case we want to know the number (for testing).
                int guess = 0;  //Number entered by the player
                int count = 0;  //Number of tries of guessing the number
                while(guess != theNumber){
                    System.out.println("Guess a number between 1 and 100:");
                    guess = scan.nextInt(); //Reads the number typed on the keyboard by the player
                    count++;    //Plus 1 every time a number is entered
                    System.out.println("You entered " + guess +".");
                    if(guess < theNumber) { //If number entered is smaller
                        System.out.println("The number is bigger" + ", try again!");
                        System.out.println("Number of tries: " + count);
                    } else if(guess > theNumber) { //If number entered is bigger
                        System.out.println("The number is smaller" + ", try again!");
                        System.out.println("Number of tries: " + count);
                    } else {    //If both previous cases are false
                        System.out.println("Congratulations! You've found the number!");
                    }
                }
                //Once guess == theNumber
                System.out.println("Number of tries: " + count);
                System.out.println("Play again? (y/n)");
                playAgain = scan.next();    //Reads the String entered from keyboard by the player
            }
            while(playAgain.equalsIgnoreCase("y"));     //If player enters y, start again.
            //Otherwise
            System.out.println("Thank you for playing! Goodbye :)");
        } catch (Exception e) {
            System.out.println("Incorrect entering! Please enter a number between 1 and 100.");
        }
        scan.close();   //Close scanner
    }   //Close main
}   //Close class

person Vicentequesada    schedule 01.12.2017    source sumber
comment
Program berakhir karena setelah catch Anda menutup pemindai dan kembali dari utama, jadi apa yang Anda harapkan?   -  person tkausl    schedule 01.12.2017
comment
Lalu bagaimana cara memperbaikinya? Jika saya mengubah struktur pernyataan do-sementara, kesalahan muncul di Eclipse dan tidak mengizinkan saya untuk mengkompilasi. Saya berpikir untuk menambahkan tebak = scan.nextInt() setelah System.out.println(), tetapi tidak berhasil.   -  person Vicentequesada    schedule 01.12.2017


Jawaban (2)


tempatkan try-catch di dalam loop while dan aktifkan kembali objek pemindai (scan = new Scanner(System.in) di dalam blok catch.

while (guess != theNumber) {
                    try {                       
                        System.out.println("Guess a number between 1 and 100:");
                        guess = scan.nextInt(); // Reads the number typed on the
                        // keyboard by the player
                        count++; // Plus 1 every time a number is entered
                        System.out.println("You entered " + guess + ".");
                        if (guess < theNumber) { // If number entered is smaller
                            System.out.println("The number is bigger" + ", try again!");
                            System.out.println("Number of tries: " + count);
                        } else if (guess > theNumber) { // If number entered is
                            // bigger
                            System.out.println("The number is smaller" + ", try again!");
                            System.out.println("Number of tries: " + count);
                        } else { // If both previous cases are false
                            System.out.println("Congratulations! You've found the number!");
                        }
                    } catch (Exception e) {
                        System.out.println("Incorrect entering! Please enter a number between 1 and 100.");
                        scan = new Scanner(System.in);
                    }
                }
person Barr3l3y3    schedule 01.12.2017
comment
Besar! Bekerja seperti pesona! Terima kasih banyak! Saya masih punya satu pertanyaan: mengapa Anda harus membuat objek pemindai lain? Saya kurang paham, bisakah Anda menjelaskannya kepada saya agar saya bisa belajar? Terima kasih atas waktunya!! - person Vicentequesada; 01.12.2017
comment
Satu komentar lagi, saya membutuhkan satu objek pemindai lagi agar berfungsi dengan sempurna, tapi saya tidak yakin kenapa hahaha. Jika Anda bisa menjelaskannya, itu akan luar biasa! :D Terima kasih! - person Vicentequesada; 01.12.2017
comment
scan.nextInt() akan dieksekusi terlebih dahulu dan baru kemudian memberikan nilai input ke variabel tebakan. Input non int akan menyebabkan scan.nextInt() memunculkan pengecualian. Saat perulangan scan.nextInt() terus mengeluarkan pengecualian karena menampung input non int. Hal ini akan menyebabkan loop tak terbatas. Untuk mengatasi ini kita perlu memastikan objek pemindai tidak memiliki nilai input non int. Salah satu cara untuk melakukan ini adalah dengan membuat objek Scanner baru di blok catch. - person Barr3l3y3; 01.12.2017
comment
Terima kasih banyak atas bantuan Anda! Salam! - person Vicentequesada; 01.12.2017

Anda perlu memahami cara kerja blok try-catch. Anda tidak perlu mengelilingi seluruh kode dalam percobaan. Masukkan saja bagian kode yang menyebabkan pengecualian. Jadi, dalam kasus Anda cukup kelilingi guess = scan.nextInt(); dengan try dan kemudian tangkap pengecualian. Sebab, di sini pernyataan ini memunculkan pengecualian ketika inputnya bukan bilangan bulat. Dengan cara ini Anda dapat memastikan bahwa input pengguna valid untuk setiap iterasi dari loop while(guess != theNumber).

Sunting_1: Saya menghapus try-catch blok dari kode Anda dan menambahkan yang berikut ini & itu berfungsi dengan baik untuk saya:

try{
  guess = scan.nextInt();} //Reads the number typed on the keyboard by the player
catch (InputMismatchException e){
  System.out.println("Incorrect entering! Please enter a number between 1 and 100.");
  scan.nextLine();
  continue;
}
person Vineet Bhat    schedule 01.12.2017
comment
Ya, saya pikir itu bisa menjadi solusinya, tetapi ketika saya mencobanya, program selesai karena kondisi while selalu salah jika Anda memasukkan sebuah kata (misalnya) :/ - person Vicentequesada; 01.12.2017
comment
Anda perlu menambahkan scan.nextLine() di blok catch untuk dapat menggunakan ini. Saya telah mengedit jawaban saya untuk menunjukkan apa yang saya maksud. - person Vineet Bhat; 01.12.2017
comment
Mengapa Anda menggunakan pernyataan continue di sana? - person Vicentequesada; 01.12.2017
comment
Karena ketika guess tidak valid, saya tidak ingin melanjutkan lebih jauh ke dalam loop, yaitu saya tidak ingin count++ dan pernyataan setelahnya dieksekusi. Sebaliknya saya ingin iterasi berikutnya dari loop dimulai. - person Vineet Bhat; 02.12.2017