12 November 2026•baca 6 menit

Java switch: 78 yang Keluar sebagai C

Sebuah program penilaian memberi nilai 78 pada satu lembar ujian lalu mencetak grade: C. case 7 memberi B lalu jatuh ke case 6 karena break-nya hilang, dan kompilator tidak mengatakan apa pun soal itu.

Baca dalam bahasa Inggris

Kamu memberi nilai 78 pada satu lembar ujian, dan program penilaianmu mencetak C. Baris di atas nilai itu berbunyi score: 78, jadi inputnya benar. Nilainya tetap satu tingkat terlalu rendah. Prosesnya selesai normal, dengan exit status 0, tanpa peringatan kompilator dan tanpa error saat berjalan. Tidak ada apa pun di terminal yang menunjuk ke program itu.

Poin Penting

  • switch hanya keluar dari sebuah case saat mencapai break, jadi break yang hilang ikut menjalankan pernyataan case berikutnya.
  • Di program awal, case 7 memberi B dan case 6 menimpanya dengan C, jadi nilai 78 mencetak grade: C.
  • Label yang dikelompokkan seperti case 10: dan case 9: sengaja dibiarkan jatuh ke bawah, mekanisme yang sama yang dipakai secara sengaja.
  • Bentuk panah (case 8, 7 -> "B";) datang di Java 14 dan tidak bisa jatuh ke bawah, karena satu arm tidak punya pernyataan untuk dimasuki.
  • score / 10 menaruh 89 dan 80 di keranjang yang sama, jadi aturan ambang seperti 85 ke atas butuh rantai if, bukan switch.
  • Checker dengan input tetap hanya mensertifikasi satu nilai, bukan aturan penilaiannya: beri 95 dan ia melaporkan 0 of 2 checks passed.

Program yang mencetak C

Berkasnya berisi satu kelas dengan satu int score dan sebuah switch pada score / 10. Tiap case memilih satu huruf untuk satu rentang nilai, dan default menangani sisanya.

JAVA
// Grade.java
public class Grade {
    public static void main(String[] args) {
        int score = 78;
        String grade;
        switch (score / 10) {
            case 10:
            case 9:
                grade = "A";
                break;
            case 8:
                grade = "B";
                break;
            case 7:
                grade = "B";
            case 6:
                grade = "C";
                break;
            default:
                grade = "D";
        }
        System.out.println("score: " + score);
        System.out.println("grade: " + grade);
    }
}

Kompilasi dan jalankan dengan perintah di bawah ini.

Keluaran
$ javac Grade.java && java Grade
score: 78
grade: C

Baris skornya benar. Karena score bertipe int, 78 / 10 adalah pembagian bulat dan menghasilkan 7, jadi switch masuk ke case 7. Baca case itu di sumbernya dan semuanya terlihat benar, karena ia memberi B. Tidak ada apa pun di output yang mengatakan case mana yang berjalan atau apa yang dilakukannya. Kamu hanya mendapat huruf akhirnya, dan huruf akhirnya salah.

Apa yang sebenarnya dilakukan break

Tanpa break, kendali tidak keluar dari switch di akhir sebuah case. Ia justru berjalan terus ke pernyataan case berikutnya. Di sini case 7 memberi B, lalu kendali berlanjut ke case 6, yang menimpanya dengan C. break setelah case 6 adalah yang pertama menghentikan alurnya.

Bagian atas switch memakai perilaku yang sama dengan sengaja. case 10: tidak punya pernyataan dan tidak punya break, jadi ia jatuh ke case 9:, dan kedua label berbagi satu A. Jatuh ke bawah adalah alat saat kamu menulisnya dengan sengaja. Ia jadi bug saat kamu cuma lupa menghentikannya.

Kompilator diam soal perbedaan itu. Kedua versi sama-sama Java yang legal, jadi programnya terkompilasi, berjalan, dan keluar dengan status 0. Kamu harus menyadari sendiri break yang hilang itu, atau mencari cara supaya outputnya bicara.

Pemeriksaan yang bisa kamu jalankan

Checker ini membaca dua baris yang dicetak program dan membandingkannya dengan nilai yang seharusnya untuk 78. Ia menghitung yang lolos, melaporkan baris mana pun yang tidak cocok, dan menandai baris tambahan.

JAVA
// CheckGrade.java
import java.util.List;
import java.util.Scanner;

public class CheckGrade {
    public static void main(String[] args) {
        List<String> expected = List.of("score: 78", "grade: B");
        Scanner in = new Scanner(System.in);
        int passed = 0;
        for (int i = 0; i < expected.size(); i++) {
            String got = in.hasNextLine() ? in.nextLine() : "<nothing>";
            if (got.equals(expected.get(i))) {
                passed++;
                System.out.println("PASS  line " + (i + 1) + ": " + got);
            } else {
                System.out.println("FAIL  line " + (i + 1) + ": expected " + expected.get(i) + ", got " + got);
            }
        }
        if (in.hasNextLine()) {
            System.out.println("FAIL  extra line: " + in.nextLine());
        }
        System.out.println();
        System.out.println(passed + " of " + expected.size() + " checks passed");
        if (passed != expected.size()) {
            System.exit(1);
        }
    }
}

Kompilasi checker-nya lalu sambungkan output program ke situ dengan perintah ini.

Keluaran
$ javac CheckGrade.java && java Grade | java CheckGrade
PASS  line 1: score: 78
FAIL  line 2: expected grade: B, got grade: C

1 of 2 checks passed

Hanya baris pertama yang lolos. Baris kedua adalah seluruh bug-nya: checker menginginkan grade: B dan mendapat grade: C. Checker juga keluar dengan status 1 sampai kedua baris lolos, jadi kegagalannya terlihat oleh apa pun yang membaca exit status.

Bentuk yang tidak bisa jatuh ke bawah

Java 14 menambahkan bentuk panah untuk switch, dan itu fitur standar di Java 21 yang dipakai di sini. Tiap arm -> memuat satu hasil, dan tidak ada pernyataan di bawahnya untuk dimasuki. Program yang sama dalam bentuk itu terlihat seperti ini.

JAVA
// Grade.java
public class Grade {
    public static void main(String[] args) {
        int score = 78;
        String grade = switch (score / 10) {
            case 10, 9 -> "A";
            case 8, 7 -> "B";
            case 6 -> "C";
            default -> "D";
        };
        System.out.println("score: " + score);
        System.out.println("grade: " + grade);
    }
}

Kompilasi dan jalankan.

Keluaran
$ javac Grade.java && java Grade
score: 78
grade: B

Lalu jalankan checker yang sama terhadapnya.

Keluaran
$ java Grade | java CheckGrade
PASS  line 1: score: 78
PASS  line 2: grade: B

2 of 2 checks passed

Tiga hal berubah. Tiap arm -> menghasilkan satu hasil. Satu arm bisa membawa beberapa label, seperti pada case 10, 9 -> "A";. Dan tidak ada cara untuk jatuh ke arm berikutnya, jadi kesalahan dari versi pertama tidak bisa ditulis di sini.

Saat batasnya bukan kelipatan sepuluh

Bentuk panah menghapus fall-through, tapi tidak mengubah aritmetikanya. score / 10 menaruh 89 dan 80 di keranjang yang sama, karena keduanya terbagi jadi 8. Versi panah mencetak grade: B untuk nilai 89. Aturan yang mengatakan 85 ke atas adalah A tidak bisa ditulis sebagai case pada score / 10. Rantai if dengan score >= 85 menyatakan aturan itu langsung, seperti yang dilakukan program berikut dengan skor disetel ke 89.

JAVA
// GradeIf.java
public class GradeIf {
    public static void main(String[] args) {
        int score = 89;
        String grade;
        if (score >= 85) {
            grade = "A";
        } else if (score >= 70) {
            grade = "B";
        } else if (score >= 60) {
            grade = "C";
        } else {
            grade = "D";
        }
        System.out.println("score: " + score);
        System.out.println("grade: " + grade);
    }
}
Keluaran
$ javac GradeIf.java && java GradeIf
score: 89
grade: A

Itu A untuk 89 yang sama yang dinilai B oleh switch panah. Kedua konstruksi menjawab pertanyaan berbeda saat batasnya bukan kelipatan sepuluh. Pilih switch saat nilainya diskret dan sedikit. Pilih if saat aturannya berupa ambang.

Sebelum artikel berikutnya

Buka berkas yang sudah diperbaiki dan ubah int score = 78; menjadi 95. Jalankan lalu sambungkan ke checker yang sama, tanpa diubah.

Kamu akan melihat score: 95 dan grade: A, yang merupakan nilai yang benar untuk 95. Checker tetap melaporkan 0 of 2 checks passed, karena ia mengharapkan score: 78. Inputnya tetap, jadi ia mensertifikasi satu input dan bukan aturannya.

Kalau sebuah tes hanya pernah memberi satu nilai, bagian mana dari aturan penilaian yang masih belum terbukti?

Biar makin jago ngoding.

Yuk gabung bareng temen-temen developer lainnya buat dapet update teknologi, tips, dan tutorial santai tiap minggu.

Biar Nggak Kudet

Update teknologi, tips ngoding, dan insight santai langsung ke email kamu tiap minggu.

Santai, anti spam. Bisa berhenti langganan kapan aja.

Baca Selanjutnya

Lihat semua

Untuk developer yang belajar dari kesulitan

© 2026 Inva.dev.