[{"data":1,"prerenderedAt":207},["ShallowReactive",2],{"site-header":3,"site-footer-license":37,"article-sistem-input-pada-bahasa-java-with-latest":41},{"navigations":4},[5,20],{"collection":6,"item":7},"series",{"__typename":6,"title":8,"slug":9,"children_series":10},"Artikel","all",[11,14,17],{"title":12,"slug":13},"Algoritma dan Struktur Data","algoritma-struktur-data",{"title":15,"slug":16},"Konsep Dasar Pemrograman","konsep-dasar-pemrograman",{"title":18,"slug":19},"Kecerdasan Artifisial","kecerdasan-artifisial",{"collection":6,"item":21},{"__typename":6,"title":22,"slug":23,"children_series":24},"Tutorial","tutorial",[25,28,31,34],{"title":26,"slug":27},"Belajar Java","belajar-java",{"title":29,"slug":30},"Belajar Pascal","belajar-pascal",{"title":32,"slug":33},"Belajar Python","belajar-python",{"title":35,"slug":36},"Belajar Golang","belajar-golang",{"name":38,"url":39,"show":40},"CC BY-SA","https://creativecommons.org/licenses/by-sa/4.0/",false,{"article":42,"renderedBody":136,"renderedTakeaway":137,"latestArticles":138,"toc":190},{"id":43,"title":44,"slug":45,"excerpt":46,"published_at":47,"thumbnail_image":48,"tags":50,"reading_time":54,"takeway":55,"body":56,"authors":57,"series":63},"55","Sistem Input pada Bahasa Java","sistem-input-pada-bahasa-java","Pada bahasa Java, sistem input dilayani oleh objek yang bernama Scanner. Objek ini memiliki banyak method yang dapat digunakan untuk sistem input.","2022-09-27T14:15:59.000Z",{"id":49},"3cdb0187-3373-401c-aeaf-abeda8170a90",[51,52,53],"java","input-output","dasar",7,null,"Sebelumnya kita telah membahas tentang [sistem output](https://www.invasikode.com/sistem-output-pada-bahasa-java). Kita juga sudah membahas tentang [variabel dan literal](https://www.invasikode.com/variabel-dan-literal-pada-bahasa-java). Tetapi, sejauh ini program yang kita buat masih begitu-begitu saja. Satu arah, hanya menampilkan output tanpa ada sesuatu yang interaktif.\n\nSalah satu cara yang bisa dilakukan untuk membuat program kita lebih interaktif adalah dengan menggunakan sistem input.\n\nBagaimana cara membuat sistem input pada Java, dan apa yang bisa kita lakukan dengan ini? mari kita bahas lebih lanjut.\n\n## Sekilas tentang Sistem Input dan Scanner\n\nSistem input, adalah perintah yang kita gunakan untuk memerintahkan komputer mengambil masukan dari pengguna.\n\nSecara umum, masukan ini bisa berupa ketikan keyboard, klik mouse, sentuhan layar, dan lain sebagainya.\n\nWalaupun ada banyak cara melakukan input, fokus kita kali ini cukup inputan dari ketikan user saja. Jadi kita akan coba membaca ketikan user pada layar terminal dan memasukkannya pada sebuah variabel.\n\nPada bahasa Java, sistem input dilayani oleh objek yang bernama `Scanner`. Objek ini sudah tersedia dan bisa kita gunakan dengan melakukan import library terlebih dahulu, yaitu `java.util.*` atau `java.util.Scanner`.\n\n> **Library** merupakan koleksi kode yang sudah sudah dituliskan, sehingga kita tidak perlu lagi menulis kode dari awal untuk melakukan hal-hal sepele seperti sistem input ini.\n\nDalam inisialisasinya, objek `Scanner` harus memiliki sumber input sebagai argumennya. Karena kali ini kita mengambil inputan dari terminal, maka argumen yang diberikan adalah `System.in`.\n\nUntuk lebih jelasnya tentang `Scanner`, bisa kalian coba ketik dan jalankan kode berikut:\n\n```java\nimport java.util.Scanner;  // import Scanner\n\npublic class SistemOutput {\n  public static void main(String[] args) {\n    Scanner scanner = new Scanner(System.in);  // inisialisasi objek scanner\n    System.out.print(\"Masukkan nama: \");\n    String nama = scanner.nextLine();          // membaca inputan dari keyboard\n    System.out.println(\"Halo \" + nama);        // output hasil inputan\n  }\n}\n```\n\nKetika program dijalankan, maka program akan berhenti pada tulisan `Masukkan nama:`. Ini karena ketika kita panggil `scanner.nextLine()` program akan menunggu inputan dari user.\n\nSelanjutnya coba ketikkan sebuah nama, misal \"Inva\" lalu tekan tombol enter. Nantinya akan keluar outputan **\"Halo Inva\"**. Lengkapnya seperti ini:\n\n```\nMasukkan nama: Inva\nHalo Inva\n```\n\nPada contoh tersebut kita telah menggunakan method `nextLine`. Method ini berfungsi untuk mengambil inputan yang bertipe `String` alias huruf atau kumpulan huruf.\n\nBiasanya terjadi salah paham antara `Scanner` dan `scanner`. Walaupun sekilas terlihat sama, 2 keyword ini sangat berbeda. `Scanner` dengan kapital \"S\" merupakan objek, sedangkan `scanner` dengan \"s\" kecil merupakan identifier yang kita buat untuk menampung objek `Scanner`. Bisa dibilang `scanner` adalah variabel yang menampung `Scanner`.\n\n> Karena \\`scanner\\` pada contoh ini adalah identifier, seperti identifier pada umumnya, kalian bisa mengganti namanya sesuka hati. Yang perlu diperhatikan adalah ketika melakukan pemanggilan, identifier yang digunakan juga harus sama.\n\n## Method-method dalam Scanner\n\nPenggunaan method pada objek Scanner harus disesuaikan dengan tipe data inputan, sehingga ada banyak method yang disediakan, diantaranya yaitu:\n\n* `nextLine` — Mengambil inputan `string`\n* `nextInt` — Mengambil inputan `int` atau angka bulat\n* `nextFloat` — Mengambil inputan `float` atau angka desimal\n\nSelain itu juga ada method lainnya seperti `nextBoolean`, `nextDouble`, dan `nextLong`. Dari namanya sudah kelihatan ya fungsinya apa.\n\nPenggunaan method-method ini kurang lebih sama seperti sebelumnya. Kita harus membuat objek Scanner terlebih dahulu lalu memanggil method sesuai fungsinya. Contohnya seperti ini.\n\n```java\nimport java.util.Scanner;\n\npublic class SistemOutput {\n  public static void main(String[] args) {\n    Scanner scanner = new Scanner(System.in);\n    \n    System.out.print(\"Masukkan nama         : \");\n    String nama = scanner.nextLine();\n    System.out.print(\"Masukkan angka bulat  : \");\n    int bulat = scanner.nextInt();\n    System.out.print(\"Masukkan angka pecahan: \");\n    float pecahan = scanner.nextFloat();\n    float hasil = bulat + pecahan;\n    \n    System.out.println(\"Halo \" + nama);\n    System.out.printf(\"Hasil dari %d + %.2f adalah %.2f\", bulat, pecahan, hasil);\n  }\n}\n```\n\nPada program tersebut kita menginginkan user melakukan 3 inputan. Pertama adalah nama dengan tipe data `string`, selanjutnya ada angka bulat dengan tipe data `int`, dan terakhir adalah angka pecahan dengan tipe data `float`. Karena semua punya tipe data yang berbeda, method yang digunakan juga harus disesuaikan.\n\nSelanjutnya dilakukan penjumlahan antara angka bulat dan angka pecahan dan dimasukkan ke dalam variabel hasil. Variabel ini bertipe float karena kita memiliki variabel `pecahan` yang juga bertipe `float`.\n\nTerakhir, kita mengoutputkan nama dengan method `println`, serta angka bulat, pecahan, dan hasil dengan method `printf` seperti yang terlihat di atas. Kalau lupa apa maksud dari `printf` tersebut bisa lihat lagi di [sini](https://www.invasikode.com/sistem-output-pada-bahasa-java).\n\nJika kita coba jalankan dan memasukkan data dengan tipe data yang sesuai, maka kurang lebih akan keluar hasil sebagai berikut.\n\n```\nMasukkan nama         : Inva\nMasukkan angka bulat  : 23\nMasukkan angka pecahan: 3.1415\nHalo Inva\nHasil dari 23 + 3.14 adalah 26.14\n```\n\nBisa dilihat ya, hasilnya sudah sesuai dengan logika yang kita buat sebelumnya. Tetapi, jika kita coba memasukkan data yang tidak sesuai tipenya, program akan error seketika. Silahkan bisa dicoba sendiri.\n\n## Karakter Pemisah Input pada Java\n\nSebenarnya Java bukan membaca inputan berdasarkan hasil klik tombol, melainkan karakter yang dihasilkan oleh tombol tersebut yang sebenarnya digunakan. Bingung? jadi begini..\n\nKetika kita menggunakan method `nextLine`, objek scanner akan membaca seluruh baris inputan kita sampai menemukan karakter `\\n` atau yang disebut **escaped character newline**. Nah, untuk menginputkan karakter `\\n` ini kita bisa menggunakan tombol enter pada keyboard. \n\nLain cerita jika kita menggunakan method selain `nextLine`, seperti `nextInt` dan `nextFloat`. Method-method ini tidak hanya menggunakan karakter `\\n` sebagai tanda, melainkan juga karakter whitespace lain seperti **space** alias spasi.\n\nSupaya dapat gambaran, kita langsung saja coba dengan kode program.\n\n```java\nimport java.util.Scanner;\n\npublic class SistemOutput {\n  public static void main(String[] args) {\n    Scanner scanner = new Scanner(System.in);\n    System.out.print(\"Masukkan 2 angka dipisah dengan spasi: \");\n    int angka1 = scanner.nextInt();\n    int angka2 = scanner.nextInt();\n    int hasil = angka1 + angka2;\n    \n    System.out.printf(\"hasil dari %d + %d adalah %d\", angka1, angka2, hasil);\n  }\n}\n```\n\nPada kode tersebut kita bermaksud untuk menjumlahkan 2 angka yang berasal dari inputan pengguna. Kali ini kita coba memasukkan 2 angka yang dipisahkan dengan karakter spasi, semisal \\`23 7\\`. Maka hasilnya akan seperti ini.\n\n```\nMasukkan 2 angka dipisah dengan spasi: 23 7\nhasil dari 23 + 7 adalah 30\n```\n\nBisa dilihat ya, hasil yang keluar sesuai dengan inputan yang diberikan, yaitu 30 sebagai hasil penjumlahan dari 23 dan 7.\n\nJika kita coba menggunakan tombol enter hasilnya juga akan sama, kurang lebih seperti ini:\n\n```\nMasukkan 2 angka dipisah dengan spasi: 23\n7\nhasil dari 23 + 7 adalah 30\n```\n\nIngat ya, hal ini tidak berlaku untuk inputan dengan method `nextLine`. Ini karena `nextLine` hanya akan membaca inputan ketika sudah menemukan karakter `\\n` alias ketika kita menekan tombol enter.\n\n## Catatan: Hati-hati dengan Scanner\n\nSeperti yang disebutkan di atas, method **selain** `nextLine` akan diproses ketika sudah menemukan karakter whitespace. Hal ini ternyata menimbulkan sedikit masalah pada Java.\n\nMasalah yang muncul adalah ketika kita coba memanggil method `nextLine` setelah pemanggilan method lainnya seperti `nextInt` atau `nextFloat`. Contohnya seperti ini.\n\n```java\nimport java.util.Scanner;\n\npublic class SistemOutput {\n  public static void main(String[] args) {\n    Scanner scanner = new Scanner(System.in);\n    System.out.print(\"Masukkan angka : \");\n    int angka = scanner.nextInt();\n    System.out.print(\"Masukkan nama  : \");\n    String nama = scanner.nextLine();\n    \n    System.out.println(\"Isi variabel angka : \" + angka);\n    System.out.println(\"Isi variabel nama  : \" + nama);\n  }\n}\n```\n\nSekarang coba jalankan kode tersebut dan inputkan sesuai perintah yang diberikan.\n\nJika sudah, maka kurang lebih hasilnya akan seperti ini.\n\n```\nMasukkan angka : 24\nMasukkan nama  : Isi variabel angka : 24\nIsi variabel nama  :\n```\n\nNah loh, ketika kita menginputkan angka lalu menekan tombol enter, inputan kedua untuk meminta nama tidak dijalankan malah langsung keluar output seperti itu. Kira-kira kenapa?\n\nHal ini disebabkan karena method `nextInt` atau lainnya tidak menghilangkan karakter `\\n` alias newline. Jadi ketika kita menekan enter setelah memasukkan angka, karakter `\\n` sebenarnya masih tertinggal di sana.\n\nMasih ingat ya, kalau method `nextLine` membaca baris sampai ditemukan karakter `\\n`. Nah, karena setelah pemanggilan `nextInt` karakter tersebut masih tertinggal, maka method `nextLine` akan membaca baris kosong. Ini juga yang menyebabkan inputan nama tidak diminta oleh program.\n\n> Untuk tahu lebih lanjut mengenai hal ini bisa join baca di lapak [stackoverflow ini](https://stackoverflow.com/questions/13102045/scanner-is-skipping-nextline-after-using-next-or-nextfoo)\n\n**Lalu solusinya bagaimana?**\n\nSolusinya gampang, tinggal minta inputan lagi. Jadi kode yang sebelumnya bisa kita ubah menjadi seperti ini.\n\n```java\nimport java.util.Scanner;\n\npublic class SistemOutput {\n  public static void main(String[] args) {\n    Scanner scanner = new Scanner(System.in);\n    System.out.print(\"Masukkan angka : \");\n    int angka = scanner.nextInt();\n    System.out.print(\"Masukkan nama  : \");\n    scanner.nextLine(); // tambahkan baris ini\n    String nama = scanner.nextLine();\n    \n    System.out.println(\"Isi variabel angka : \" + angka);\n    System.out.println(\"Isi variabel nama  : \" + nama);\n  }\n}\n```\n\nJika dijalankan maka luarannya pasti akan sesuai.\n\n```\nMasukkan angka : 24\nMasukkan nama  : Inva\nIsi variabel angka : 24\nIsi variabel nama  : Inva\n```\n\nSedikit penjelasan, pada kode tersebut kita memanggil method `nextLine` sebanyak 2 kali. Pemanggilan pertama bertujuan untuk membaca sekaligus menghilangkan karakter `\\n` sisa dari method `nextInt` sebelumnya. Sedangkan panggilan kedua berfungsi untuk mengambil inputan nama dari user.\n\nJadi jangan heran kalau pemanggilan `nextLine` pertama tidak melibatkan assignment variabel sama sekali.\n\n## Selanjutnya\n\nSetelah mengetahui tentang sistem input pada Java, pada kesempatan selanjutnya kita akan membahas lebih dalam tentang variabel dan tipe datanya.\n\nSelamat berkoding ria",[58],{"authors_id":59},{"name":60,"slug":61,"role":62,"profile_picture":55},"Daffa Izzuddin","izzudd","Writer",{"id":64,"title":65,"slug":66,"articles":67,"parent_series":126},"21","Berkenalan dengan Java","java-intro",[68,78,86,96,106,114,123],{"id":69,"title":70,"slug":71,"excerpt":72,"thumbnail_image":73,"tags":75},"49","Berkenalan dengan Bahasa Java","berkenalan-dengan-bahasa-java","Java merupakan bahasa pemrograman tingkat tinggi dengan paradigma OOP. Bahasa ini punya slogan “write once, run anywhere”",{"id":74},"1b4c8254-328d-43a5-b489-6ed7c7da91a0",[51,76,77,53],"intro","pemrograman",{"id":79,"title":80,"slug":81,"excerpt":82,"thumbnail_image":83,"tags":85},"50","Membuat Program \"Hello World\" pada Java","membuat-program-hello-world-pada-java","Pada kesempatan kali ini kita akan membuat kode pertama kita, yaitu Hello World pada bahasa Java.",{"id":84},"d5ece737-b796-4209-9af8-1b7ce232d554",[51,23,53],{"id":87,"title":88,"slug":89,"excerpt":90,"thumbnail_image":91,"tags":93},"51","Mengenal Struktur Dasar Program Java","mengenal-struktur-dasar-program-java","Ibarat menulis skripsi, membuat program ternyata juga ada strukturnya. Dan struktur ini harus sesuai supaya tidak ditolak oleh sang komputer.",{"id":92},"dbfbf54c-b840-4c44-9f70-ddb80434a47d",[51,94,53,95],"syntax","konsep",{"id":97,"title":98,"slug":99,"excerpt":100,"thumbnail_image":101,"tags":103},"52","Penulisan Komentar pada Bahasa Java","penulisan-komentar-pada-bahasa-java","Java memiliki beberapa jenis komentar yaitu komentar satu baris, banyak baris, dan komentar dokumentasi.",{"id":102},"720de22b-6faa-4d9f-b7be-97b17f20f130",[51,104,94,105],"komentar","best-practice",{"id":107,"title":108,"slug":109,"excerpt":110,"thumbnail_image":111,"tags":113},"53","Sistem Output pada Bahasa Java","sistem-output-pada-bahasa-java","Ketika membuat program \"Hello World\" kita sudah melihat method `System.out.println`. Selain method tersebut masih ada method lainnya, mari kita bahas.",{"id":112},"acd35b05-1d92-4944-a89a-d2e5b352f3be",[51,52,53],{"id":115,"title":116,"slug":117,"excerpt":118,"thumbnail_image":119,"tags":121},"54","Variabel dan Literal pada Bahasa Java","variabel-dan-literal-pada-bahasa-java","Literal dan variabel merupakan komponen yang penting, karena 2 hal ini berhubungan langsung dengan data dan manipulasinya.",{"id":120},"b3cfdc00-853e-424c-8a85-20c13d627d98",[51,122,95,53],"variabel",{"id":43,"title":44,"slug":45,"excerpt":46,"thumbnail_image":124,"tags":125},{"id":49},[51,52,53],{"id":127,"title":26,"slug":27,"parent_series":128,"children_series":130},"13",{"id":129,"title":22,"slug":23,"parent_series":55},"1",[131,132],{"id":64,"title":65,"slug":66,"cover_image":55},{"id":133,"title":134,"slug":135,"cover_image":55},"22","Variabel, Tipe Data, dan Operasi","java-variabel-tipe-data","\u003Cp>Sebelumnya kita telah membahas tentang \u003Ca href=\"https://www.invasikode.com/sistem-output-pada-bahasa-java\">sistem output\u003C/a>. Kita juga sudah membahas tentang \u003Ca href=\"https://www.invasikode.com/variabel-dan-literal-pada-bahasa-java\">variabel dan literal\u003C/a>. Tetapi, sejauh ini program yang kita buat masih begitu-begitu saja. Satu arah, hanya menampilkan output tanpa ada sesuatu yang interaktif.\u003C/p>\n\u003Cp>Salah satu cara yang bisa dilakukan untuk membuat program kita lebih interaktif adalah dengan menggunakan sistem input.\u003C/p>\n\u003Cp>Bagaimana cara membuat sistem input pada Java, dan apa yang bisa kita lakukan dengan ini? mari kita bahas lebih lanjut.\u003C/p>\n\u003Ch2 id=\"sekilas-tentang-sistem-input-dan-scanner\">Sekilas tentang Sistem Input dan Scanner\u003C/h2>\n\u003Cp>Sistem input, adalah perintah yang kita gunakan untuk memerintahkan komputer mengambil masukan dari pengguna.\u003C/p>\n\u003Cp>Secara umum, masukan ini bisa berupa ketikan keyboard, klik mouse, sentuhan layar, dan lain sebagainya.\u003C/p>\n\u003Cp>Walaupun ada banyak cara melakukan input, fokus kita kali ini cukup inputan dari ketikan user saja. Jadi kita akan coba membaca ketikan user pada layar terminal dan memasukkannya pada sebuah variabel.\u003C/p>\n\u003Cp>Pada bahasa Java, sistem input dilayani oleh objek yang bernama \u003Ccode>Scanner\u003C/code>. Objek ini sudah tersedia dan bisa kita gunakan dengan melakukan import library terlebih dahulu, yaitu \u003Ccode>java.util.*\u003C/code> atau \u003Ccode>java.util.Scanner\u003C/code>.\u003C/p>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>Library\u003C/strong> merupakan koleksi kode yang sudah sudah dituliskan, sehingga kita tidak perlu lagi menulis kode dari awal untuk melakukan hal-hal sepele seperti sistem input ini.\u003C/p>\n\u003C/blockquote>\n\u003Cp>Dalam inisialisasinya, objek \u003Ccode>Scanner\u003C/code> harus memiliki sumber input sebagai argumennya. Karena kali ini kita mengambil inputan dari terminal, maka argumen yang diberikan adalah \u003Ccode>System.in\u003C/code>.\u003C/p>\n\u003Cp>Untuk lebih jelasnya tentang \u003Ccode>Scanner\u003C/code>, bisa kalian coba ketik dan jalankan kode berikut:\u003C/p>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">JAVA\u003C/span>\n    \u003C/div>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"import%20java.util.Scanner%3B%20%20%2F%2F%20import%20Scanner%0A%0Apublic%20class%20SistemOutput%20%7B%0A%20%20public%20static%20void%20main(String%5B%5D%20args)%20%7B%0A%20%20%20%20Scanner%20scanner%20%3D%20new%20Scanner(System.in)%3B%20%20%2F%2F%20inisialisasi%20objek%20scanner%0A%20%20%20%20System.out.print(%22Masukkan%20nama%3A%20%22)%3B%0A%20%20%20%20String%20nama%20%3D%20scanner.nextLine()%3B%20%20%20%20%20%20%20%20%20%20%2F%2F%20membaca%20inputan%20dari%20keyboard%0A%20%20%20%20System.out.println(%22Halo%20%22%20%2B%20nama)%3B%20%20%20%20%20%20%20%20%2F%2F%20output%20hasil%20inputan%0A%20%20%7D%0A%7D\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>import java.util.Scanner;  // import Scanner\n\npublic class SistemOutput {\n  public static void main(String[] args) {\n    Scanner scanner = new Scanner(System.in);  // inisialisasi objek scanner\n    System.out.print(\"Masukkan nama: \");\n    String nama = scanner.nextLine();          // membaca inputan dari keyboard\n    System.out.println(\"Halo \" + nama);        // output hasil inputan\n  }\n}\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Ketika program dijalankan, maka program akan berhenti pada tulisan \u003Ccode>Masukkan nama:\u003C/code>. Ini karena ketika kita panggil \u003Ccode>scanner.nextLine()\u003C/code> program akan menunggu inputan dari user.\u003C/p>\n\u003Cp>Selanjutnya coba ketikkan sebuah nama, misal &quot;Inva&quot; lalu tekan tombol enter. Nantinya akan keluar outputan \u003Cstrong>&quot;Halo Inva&quot;\u003C/strong>. Lengkapnya seperti ini:\u003C/p>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">TEXT\u003C/span>\n    \u003C/div>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"Masukkan%20nama%3A%20Inva%0AHalo%20Inva\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>Masukkan nama: Inva\nHalo Inva\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Pada contoh tersebut kita telah menggunakan method \u003Ccode>nextLine\u003C/code>. Method ini berfungsi untuk mengambil inputan yang bertipe \u003Ccode>String\u003C/code> alias huruf atau kumpulan huruf.\u003C/p>\n\u003Cp>Biasanya terjadi salah paham antara \u003Ccode>Scanner\u003C/code> dan \u003Ccode>scanner\u003C/code>. Walaupun sekilas terlihat sama, 2 keyword ini sangat berbeda. \u003Ccode>Scanner\u003C/code> dengan kapital &quot;S&quot; merupakan objek, sedangkan \u003Ccode>scanner\u003C/code> dengan &quot;s&quot; kecil merupakan identifier yang kita buat untuk menampung objek \u003Ccode>Scanner\u003C/code>. Bisa dibilang \u003Ccode>scanner\u003C/code> adalah variabel yang menampung \u003Ccode>Scanner\u003C/code>.\u003C/p>\n\u003Cblockquote>\n\u003Cp>Karena `scanner` pada contoh ini adalah identifier, seperti identifier pada umumnya, kalian bisa mengganti namanya sesuka hati. Yang perlu diperhatikan adalah ketika melakukan pemanggilan, identifier yang digunakan juga harus sama.\u003C/p>\n\u003C/blockquote>\n\u003Ch2 id=\"method-method-dalam-scanner\">Method-method dalam Scanner\u003C/h2>\n\u003Cp>Penggunaan method pada objek Scanner harus disesuaikan dengan tipe data inputan, sehingga ada banyak method yang disediakan, diantaranya yaitu:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Ccode>nextLine\u003C/code> — Mengambil inputan \u003Ccode>string\u003C/code>\u003C/li>\n\u003Cli>\u003Ccode>nextInt\u003C/code> — Mengambil inputan \u003Ccode>int\u003C/code> atau angka bulat\u003C/li>\n\u003Cli>\u003Ccode>nextFloat\u003C/code> — Mengambil inputan \u003Ccode>float\u003C/code> atau angka desimal\u003C/li>\n\u003C/ul>\n\u003Cp>Selain itu juga ada method lainnya seperti \u003Ccode>nextBoolean\u003C/code>, \u003Ccode>nextDouble\u003C/code>, dan \u003Ccode>nextLong\u003C/code>. Dari namanya sudah kelihatan ya fungsinya apa.\u003C/p>\n\u003Cp>Penggunaan method-method ini kurang lebih sama seperti sebelumnya. Kita harus membuat objek Scanner terlebih dahulu lalu memanggil method sesuai fungsinya. Contohnya seperti ini.\u003C/p>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">JAVA\u003C/span>\n    \u003C/div>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"import%20java.util.Scanner%3B%0A%0Apublic%20class%20SistemOutput%20%7B%0A%20%20public%20static%20void%20main(String%5B%5D%20args)%20%7B%0A%20%20%20%20Scanner%20scanner%20%3D%20new%20Scanner(System.in)%3B%0A%20%20%20%20%0A%20%20%20%20System.out.print(%22Masukkan%20nama%20%20%20%20%20%20%20%20%20%3A%20%22)%3B%0A%20%20%20%20String%20nama%20%3D%20scanner.nextLine()%3B%0A%20%20%20%20System.out.print(%22Masukkan%20angka%20bulat%20%20%3A%20%22)%3B%0A%20%20%20%20int%20bulat%20%3D%20scanner.nextInt()%3B%0A%20%20%20%20System.out.print(%22Masukkan%20angka%20pecahan%3A%20%22)%3B%0A%20%20%20%20float%20pecahan%20%3D%20scanner.nextFloat()%3B%0A%20%20%20%20float%20hasil%20%3D%20bulat%20%2B%20pecahan%3B%0A%20%20%20%20%0A%20%20%20%20System.out.println(%22Halo%20%22%20%2B%20nama)%3B%0A%20%20%20%20System.out.printf(%22Hasil%20dari%20%25d%20%2B%20%25.2f%20adalah%20%25.2f%22%2C%20bulat%2C%20pecahan%2C%20hasil)%3B%0A%20%20%7D%0A%7D\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>import java.util.Scanner;\n\npublic class SistemOutput {\n  public static void main(String[] args) {\n    Scanner scanner = new Scanner(System.in);\n    \n    System.out.print(\"Masukkan nama         : \");\n    String nama = scanner.nextLine();\n    System.out.print(\"Masukkan angka bulat  : \");\n    int bulat = scanner.nextInt();\n    System.out.print(\"Masukkan angka pecahan: \");\n    float pecahan = scanner.nextFloat();\n    float hasil = bulat + pecahan;\n    \n    System.out.println(\"Halo \" + nama);\n    System.out.printf(\"Hasil dari %d + %.2f adalah %.2f\", bulat, pecahan, hasil);\n  }\n}\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Pada program tersebut kita menginginkan user melakukan 3 inputan. Pertama adalah nama dengan tipe data \u003Ccode>string\u003C/code>, selanjutnya ada angka bulat dengan tipe data \u003Ccode>int\u003C/code>, dan terakhir adalah angka pecahan dengan tipe data \u003Ccode>float\u003C/code>. Karena semua punya tipe data yang berbeda, method yang digunakan juga harus disesuaikan.\u003C/p>\n\u003Cp>Selanjutnya dilakukan penjumlahan antara angka bulat dan angka pecahan dan dimasukkan ke dalam variabel hasil. Variabel ini bertipe float karena kita memiliki variabel \u003Ccode>pecahan\u003C/code> yang juga bertipe \u003Ccode>float\u003C/code>.\u003C/p>\n\u003Cp>Terakhir, kita mengoutputkan nama dengan method \u003Ccode>println\u003C/code>, serta angka bulat, pecahan, dan hasil dengan method \u003Ccode>printf\u003C/code> seperti yang terlihat di atas. Kalau lupa apa maksud dari \u003Ccode>printf\u003C/code> tersebut bisa lihat lagi di \u003Ca href=\"https://www.invasikode.com/sistem-output-pada-bahasa-java\">sini\u003C/a>.\u003C/p>\n\u003Cp>Jika kita coba jalankan dan memasukkan data dengan tipe data yang sesuai, maka kurang lebih akan keluar hasil sebagai berikut.\u003C/p>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">TEXT\u003C/span>\n    \u003C/div>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"Masukkan%20nama%20%20%20%20%20%20%20%20%20%3A%20Inva%0AMasukkan%20angka%20bulat%20%20%3A%2023%0AMasukkan%20angka%20pecahan%3A%203.1415%0AHalo%20Inva%0AHasil%20dari%2023%20%2B%203.14%20adalah%2026.14\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>Masukkan nama         : Inva\nMasukkan angka bulat  : 23\nMasukkan angka pecahan: 3.1415\nHalo Inva\nHasil dari 23 + 3.14 adalah 26.14\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Bisa dilihat ya, hasilnya sudah sesuai dengan logika yang kita buat sebelumnya. Tetapi, jika kita coba memasukkan data yang tidak sesuai tipenya, program akan error seketika. Silahkan bisa dicoba sendiri.\u003C/p>\n\u003Ch2 id=\"karakter-pemisah-input-pada-java\">Karakter Pemisah Input pada Java\u003C/h2>\n\u003Cp>Sebenarnya Java bukan membaca inputan berdasarkan hasil klik tombol, melainkan karakter yang dihasilkan oleh tombol tersebut yang sebenarnya digunakan. Bingung? jadi begini..\u003C/p>\n\u003Cp>Ketika kita menggunakan method \u003Ccode>nextLine\u003C/code>, objek scanner akan membaca seluruh baris inputan kita sampai menemukan karakter \u003Ccode>\\n\u003C/code> atau yang disebut \u003Cstrong>escaped character newline\u003C/strong>. Nah, untuk menginputkan karakter \u003Ccode>\\n\u003C/code> ini kita bisa menggunakan tombol enter pada keyboard. \u003C/p>\n\u003Cp>Lain cerita jika kita menggunakan method selain \u003Ccode>nextLine\u003C/code>, seperti \u003Ccode>nextInt\u003C/code> dan \u003Ccode>nextFloat\u003C/code>. Method-method ini tidak hanya menggunakan karakter \u003Ccode>\\n\u003C/code> sebagai tanda, melainkan juga karakter whitespace lain seperti \u003Cstrong>space\u003C/strong> alias spasi.\u003C/p>\n\u003Cp>Supaya dapat gambaran, kita langsung saja coba dengan kode program.\u003C/p>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">JAVA\u003C/span>\n    \u003C/div>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"import%20java.util.Scanner%3B%0A%0Apublic%20class%20SistemOutput%20%7B%0A%20%20public%20static%20void%20main(String%5B%5D%20args)%20%7B%0A%20%20%20%20Scanner%20scanner%20%3D%20new%20Scanner(System.in)%3B%0A%20%20%20%20System.out.print(%22Masukkan%202%20angka%20dipisah%20dengan%20spasi%3A%20%22)%3B%0A%20%20%20%20int%20angka1%20%3D%20scanner.nextInt()%3B%0A%20%20%20%20int%20angka2%20%3D%20scanner.nextInt()%3B%0A%20%20%20%20int%20hasil%20%3D%20angka1%20%2B%20angka2%3B%0A%20%20%20%20%0A%20%20%20%20System.out.printf(%22hasil%20dari%20%25d%20%2B%20%25d%20adalah%20%25d%22%2C%20angka1%2C%20angka2%2C%20hasil)%3B%0A%20%20%7D%0A%7D\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>import java.util.Scanner;\n\npublic class SistemOutput {\n  public static void main(String[] args) {\n    Scanner scanner = new Scanner(System.in);\n    System.out.print(\"Masukkan 2 angka dipisah dengan spasi: \");\n    int angka1 = scanner.nextInt();\n    int angka2 = scanner.nextInt();\n    int hasil = angka1 + angka2;\n    \n    System.out.printf(\"hasil dari %d + %d adalah %d\", angka1, angka2, hasil);\n  }\n}\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Pada kode tersebut kita bermaksud untuk menjumlahkan 2 angka yang berasal dari inputan pengguna. Kali ini kita coba memasukkan 2 angka yang dipisahkan dengan karakter spasi, semisal `23 7`. Maka hasilnya akan seperti ini.\u003C/p>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">TEXT\u003C/span>\n    \u003C/div>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"Masukkan%202%20angka%20dipisah%20dengan%20spasi%3A%2023%207%0Ahasil%20dari%2023%20%2B%207%20adalah%2030\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>Masukkan 2 angka dipisah dengan spasi: 23 7\nhasil dari 23 + 7 adalah 30\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Bisa dilihat ya, hasil yang keluar sesuai dengan inputan yang diberikan, yaitu 30 sebagai hasil penjumlahan dari 23 dan 7.\u003C/p>\n\u003Cp>Jika kita coba menggunakan tombol enter hasilnya juga akan sama, kurang lebih seperti ini:\u003C/p>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">TEXT\u003C/span>\n    \u003C/div>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"Masukkan%202%20angka%20dipisah%20dengan%20spasi%3A%2023%0A7%0Ahasil%20dari%2023%20%2B%207%20adalah%2030\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>Masukkan 2 angka dipisah dengan spasi: 23\n7\nhasil dari 23 + 7 adalah 30\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Ingat ya, hal ini tidak berlaku untuk inputan dengan method \u003Ccode>nextLine\u003C/code>. Ini karena \u003Ccode>nextLine\u003C/code> hanya akan membaca inputan ketika sudah menemukan karakter \u003Ccode>\\n\u003C/code> alias ketika kita menekan tombol enter.\u003C/p>\n\u003Ch2 id=\"catatan-hati-hati-dengan-scanner\">Catatan: Hati-hati dengan Scanner\u003C/h2>\n\u003Cp>Seperti yang disebutkan di atas, method \u003Cstrong>selain\u003C/strong> \u003Ccode>nextLine\u003C/code> akan diproses ketika sudah menemukan karakter whitespace. Hal ini ternyata menimbulkan sedikit masalah pada Java.\u003C/p>\n\u003Cp>Masalah yang muncul adalah ketika kita coba memanggil method \u003Ccode>nextLine\u003C/code> setelah pemanggilan method lainnya seperti \u003Ccode>nextInt\u003C/code> atau \u003Ccode>nextFloat\u003C/code>. Contohnya seperti ini.\u003C/p>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">JAVA\u003C/span>\n    \u003C/div>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"import%20java.util.Scanner%3B%0A%0Apublic%20class%20SistemOutput%20%7B%0A%20%20public%20static%20void%20main(String%5B%5D%20args)%20%7B%0A%20%20%20%20Scanner%20scanner%20%3D%20new%20Scanner(System.in)%3B%0A%20%20%20%20System.out.print(%22Masukkan%20angka%20%3A%20%22)%3B%0A%20%20%20%20int%20angka%20%3D%20scanner.nextInt()%3B%0A%20%20%20%20System.out.print(%22Masukkan%20nama%20%20%3A%20%22)%3B%0A%20%20%20%20String%20nama%20%3D%20scanner.nextLine()%3B%0A%20%20%20%20%0A%20%20%20%20System.out.println(%22Isi%20variabel%20angka%20%3A%20%22%20%2B%20angka)%3B%0A%20%20%20%20System.out.println(%22Isi%20variabel%20nama%20%20%3A%20%22%20%2B%20nama)%3B%0A%20%20%7D%0A%7D\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>import java.util.Scanner;\n\npublic class SistemOutput {\n  public static void main(String[] args) {\n    Scanner scanner = new Scanner(System.in);\n    System.out.print(\"Masukkan angka : \");\n    int angka = scanner.nextInt();\n    System.out.print(\"Masukkan nama  : \");\n    String nama = scanner.nextLine();\n    \n    System.out.println(\"Isi variabel angka : \" + angka);\n    System.out.println(\"Isi variabel nama  : \" + nama);\n  }\n}\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Sekarang coba jalankan kode tersebut dan inputkan sesuai perintah yang diberikan.\u003C/p>\n\u003Cp>Jika sudah, maka kurang lebih hasilnya akan seperti ini.\u003C/p>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">TEXT\u003C/span>\n    \u003C/div>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"Masukkan%20angka%20%3A%2024%0AMasukkan%20nama%20%20%3A%20Isi%20variabel%20angka%20%3A%2024%0AIsi%20variabel%20nama%20%20%3A\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>Masukkan angka : 24\nMasukkan nama  : Isi variabel angka : 24\nIsi variabel nama  :\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Nah loh, ketika kita menginputkan angka lalu menekan tombol enter, inputan kedua untuk meminta nama tidak dijalankan malah langsung keluar output seperti itu. Kira-kira kenapa?\u003C/p>\n\u003Cp>Hal ini disebabkan karena method \u003Ccode>nextInt\u003C/code> atau lainnya tidak menghilangkan karakter \u003Ccode>\\n\u003C/code> alias newline. Jadi ketika kita menekan enter setelah memasukkan angka, karakter \u003Ccode>\\n\u003C/code> sebenarnya masih tertinggal di sana.\u003C/p>\n\u003Cp>Masih ingat ya, kalau method \u003Ccode>nextLine\u003C/code> membaca baris sampai ditemukan karakter \u003Ccode>\\n\u003C/code>. Nah, karena setelah pemanggilan \u003Ccode>nextInt\u003C/code> karakter tersebut masih tertinggal, maka method \u003Ccode>nextLine\u003C/code> akan membaca baris kosong. Ini juga yang menyebabkan inputan nama tidak diminta oleh program.\u003C/p>\n\u003Cblockquote>\n\u003Cp>Untuk tahu lebih lanjut mengenai hal ini bisa join baca di lapak \u003Ca href=\"https://stackoverflow.com/questions/13102045/scanner-is-skipping-nextline-after-using-next-or-nextfoo\">stackoverflow ini\u003C/a>\u003C/p>\n\u003C/blockquote>\n\u003Cp>\u003Cstrong>Lalu solusinya bagaimana?\u003C/strong>\u003C/p>\n\u003Cp>Solusinya gampang, tinggal minta inputan lagi. Jadi kode yang sebelumnya bisa kita ubah menjadi seperti ini.\u003C/p>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">JAVA\u003C/span>\n    \u003C/div>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"import%20java.util.Scanner%3B%0A%0Apublic%20class%20SistemOutput%20%7B%0A%20%20public%20static%20void%20main(String%5B%5D%20args)%20%7B%0A%20%20%20%20Scanner%20scanner%20%3D%20new%20Scanner(System.in)%3B%0A%20%20%20%20System.out.print(%22Masukkan%20angka%20%3A%20%22)%3B%0A%20%20%20%20int%20angka%20%3D%20scanner.nextInt()%3B%0A%20%20%20%20System.out.print(%22Masukkan%20nama%20%20%3A%20%22)%3B%0A%20%20%20%20scanner.nextLine()%3B%20%2F%2F%20tambahkan%20baris%20ini%0A%20%20%20%20String%20nama%20%3D%20scanner.nextLine()%3B%0A%20%20%20%20%0A%20%20%20%20System.out.println(%22Isi%20variabel%20angka%20%3A%20%22%20%2B%20angka)%3B%0A%20%20%20%20System.out.println(%22Isi%20variabel%20nama%20%20%3A%20%22%20%2B%20nama)%3B%0A%20%20%7D%0A%7D\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>import java.util.Scanner;\n\npublic class SistemOutput {\n  public static void main(String[] args) {\n    Scanner scanner = new Scanner(System.in);\n    System.out.print(\"Masukkan angka : \");\n    int angka = scanner.nextInt();\n    System.out.print(\"Masukkan nama  : \");\n    scanner.nextLine(); // tambahkan baris ini\n    String nama = scanner.nextLine();\n    \n    System.out.println(\"Isi variabel angka : \" + angka);\n    System.out.println(\"Isi variabel nama  : \" + nama);\n  }\n}\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Jika dijalankan maka luarannya pasti akan sesuai.\u003C/p>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black/40 inline-block\">\u003C/span>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">TEXT\u003C/span>\n    \u003C/div>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"Masukkan%20angka%20%3A%2024%0AMasukkan%20nama%20%20%3A%20Inva%0AIsi%20variabel%20angka%20%3A%2024%0AIsi%20variabel%20nama%20%20%3A%20Inva\" title=\"Salin kode\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C/path>\n      \u003C/svg>\n      \u003Cspan class=\"copy-text\">Copy\u003C/span>\n    \u003C/button>\n  \u003C/div>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>Masukkan angka : 24\nMasukkan nama  : Inva\nIsi variabel angka : 24\nIsi variabel nama  : Inva\u003C/code>\u003C/pre>\n  \u003C/div>\n\u003C/div>\u003Cp>Sedikit penjelasan, pada kode tersebut kita memanggil method \u003Ccode>nextLine\u003C/code> sebanyak 2 kali. Pemanggilan pertama bertujuan untuk membaca sekaligus menghilangkan karakter \u003Ccode>\\n\u003C/code> sisa dari method \u003Ccode>nextInt\u003C/code> sebelumnya. Sedangkan panggilan kedua berfungsi untuk mengambil inputan nama dari user.\u003C/p>\n\u003Cp>Jadi jangan heran kalau pemanggilan \u003Ccode>nextLine\u003C/code> pertama tidak melibatkan assignment variabel sama sekali.\u003C/p>\n\u003Ch2 id=\"selanjutnya\">Selanjutnya\u003C/h2>\n\u003Cp>Setelah mengetahui tentang sistem input pada Java, pada kesempatan selanjutnya kita akan membahas lebih dalam tentang variabel dan tipe datanya.\u003C/p>\n\u003Cp>Selamat berkoding ria\u003C/p>\n","",[139,152,167,179],{"id":140,"title":141,"slug":142,"excerpt":143,"thumbnail_image":144,"tags":146},"46","Mengapa C Mulai Ditinggalkan: Duel Filosofi Keamanan Rust vs Kesederhanaan Zig","mengapa-c-mulai-ditinggalkan-duel-filosofi-rust-vs-zig","Pernah denger kalau sekitar 70% celah keamanan kritis software modern itu asalnya dari bahasa C? Iya, bahasa yang udah jadi fondasi internet ini 😅. Yuk, kita bedah duel filosofi Rust vs Zig dan cari tahu mana yang pas buat proyek kalian!",{"id":145},"1942a5c9-c1f6-476d-9913-768f78d9d8eb",[147,148,149,150,151],"system-programming","rust","zig","c","memory-safety",{"id":153,"title":154,"slug":155,"excerpt":156,"thumbnail_image":157,"tags":159},"45","Rate Limiting Algorithms: Token Bucket vs Leaky Bucket vs Sliding Window","rate-limiting-algorithms-token-bucket-leaky-bucket-sliding-window","Udah tahu kenapa *rate limiting* itu wajib, tapi masih bingung beda Token Bucket, Leaky Bucket, Fixed Window, dan Sliding Window? Yuk, kita adu empat algoritma ini bareng-bareng dan cari tahu mana yang paling pas buat API kalian!",{"id":158},"0e0ed26d-20c6-443c-bde1-4a6200f6f801",[160,161,162,163,164,165,166],"backend","system-design","rate-limiting","redis","api-gateway","architecture","traffict-management",{"id":168,"title":169,"slug":170,"excerpt":171,"thumbnail_image":172,"tags":174},"44","Transactional Outbox Pattern: Solusi Konsistensi Database dan Message Broker Tanpa 2PC","transactional-outbox-pattern-konsistensi-database-message-broker","Pernah nggak kalian lihat pesanan udah masuk database, tapi email konfirmasinya nggak pernah kekirim? Itu gejala *dual-write problem*. Yuk, kita bedah Transactional Outbox Pattern biar data dan *event* kalian nggak lagi berselisih paham!",{"id":173},"e3c617fd-1486-4b82-b937-94fbec846c77",[160,175,165,176,177,161,178],"microservices","database","message-broker","postgresql",{"id":180,"title":181,"slug":182,"excerpt":183,"thumbnail_image":184,"tags":186},"43","Dead Letter Queue (DLQ) & Retry Policy: Menyelamatkan Pesan Nyasar di RabbitMQ Tanpa Bikin Worker Macet","dead-letter-queue-retry-policy-rabbitmq-resilient-messaging","Pernah nggak sih, *worker* kalian nolak satu pesan terus-terusan sampai CPU melonjak 100%? Itu namanya *poison message loop*, jebakan klasik di RabbitMQ. Yuk, kita bahas cara pasang *retry policy* dan *dead letter queue* yang bener!",{"id":185},"6c0a7ead-4841-4073-b29e-df7ae0f2aa3c",[187,177,160,165,175,188,189],"rabbitmq","async","python",[191,195,198,201,204],{"text":192,"depth":193,"id":194},"Sekilas tentang Sistem Input dan Scanner",2,"sekilas-tentang-sistem-input-dan-scanner",{"text":196,"depth":193,"id":197},"Method-method dalam Scanner","method-method-dalam-scanner",{"text":199,"depth":193,"id":200},"Karakter Pemisah Input pada Java","karakter-pemisah-input-pada-java",{"text":202,"depth":193,"id":203},"Catatan: Hati-hati dengan Scanner","catatan-hati-hati-dengan-scanner",{"text":205,"depth":193,"id":206},"Selanjutnya","selanjutnya",1791045070369]