Input dan Output Console

Membaca masukan dengan ReadLine, mengonversi tipe, dan pola TryParse yang aman.

Daftar isi

Program console berinteraksi dengan pengguna melalui Console.ReadLine untuk membaca masukan dan Console.Write atau Console.WriteLine untuk menampilkan keluaran. Topik ini membahas cara membaca satu baris teks, perilaku ReadLine saat masukan habis, konversi teks menjadi angka dengan pola TryParse yang aman, dan pola perulangan validasi untuk masukan yang tidak dapat dipastikan isinya.

Membaca satu baris dengan ReadLine#

Console.ReadLine menghentikan program dan menunggu pengguna mengetik satu baris, lalu mengembalikan baris itu sebagai String tanpa karakter pindah baris di ujungnya. Nilai kembalian selalu bertipe String sekalipun yang diketik pengguna adalah angka, sehingga setiap masukan numerik harus dikonversi lebih dahulu, sebuah langkah yang dibahas pada bagian belakang topik ini. Perlu dibedakan pula dua keadaan yang tampak serupa, yaitu baris kosong yang tetap mengembalikan String berisi teks kosong, dan akhir aliran yang mengembalikan Nothing.

Program berikut membaca nama dan usia, lalu menampilkan keduanya, dan menjadi berkas utama topik ini.

vb Program.vb
Module Program

    Sub Main()
        Console.Write("Nama: ")
        Dim nama As String = Console.ReadLine()

        Console.Write("Usia: ")
        Dim teksUsia As String = Console.ReadLine()

        Dim usia As Integer
        If Integer.TryParse(teksUsia, usia) Then
            Console.WriteLine($"Halo {nama}, usia {usia} tahun.")
        Else
            Console.WriteLine("Usia harus berupa angka bulat.")
        End If
    End Sub

End Module
text Keluaran
Nama: Usia: Halo Budi, usia 35 tahun.

Keluaran di atas diperoleh dengan menyalurkan masukan melalui pipe, sehingga teks yang diketik tidak digemakan oleh terminal dan prompt tampil berurutan tanpa jeda. Pada sesi interaktif, teks Budi dan 35 muncul setelah masing-masing prompt karena terminal menggemakan pengetikan pengguna.

bash
# tidak-dijalankan
# menjalankan program dengan masukan yang disalurkan lewat pipe
printf "Budi\n35\n" | dotnet run
text Transkrip terminal
$ printf "Budi\n35\n" | dotnet run
Nama: Usia: Halo Budi, usia 35 tahun.

ReadLine yang mengembalikan Nothing#

Console.ReadLine mengembalikan Nothing ketika tidak ada baris lagi yang dapat dibaca, yaitu saat aliran masukan sudah habis. Keadaan ini muncul ketika masukan program disalurkan dari berkas atau dari program lain dan seluruh isinya telah terbaca, dan bukan ketika pengguna menekan Enter tanpa mengetik apa pun. Karena itu setiap baris yang dibaca diperiksa terhadap Nothing sebelum diproses lebih lanjut.

Program berikut membaca seluruh baris masukan sampai habis, lalu menomori setiap barisnya.

vb Contoh: membaca sampai akhir masukan
Module ContohBacaSemua

    Sub Main()
        Dim nomor As Integer = 1

        Do
            Dim baris As String = Console.ReadLine()
            If baris Is Nothing Then
                Exit Do
            End If
            Console.WriteLine($"{nomor}: {baris}")
            nomor += 1
        Loop
    End Sub

End Module
text Keluaran
1: satu
2: dua

Setelah baris dua terbaca, panggilan ReadLine berikutnya bertemu akhir aliran dan mengembalikan Nothing, sehingga blok If menjalankan Exit Do dan perulangan berakhir tanpa error.

Konversi tipe dengan TryParse#

Metode Integer.TryParse mencoba mengubah teks menjadi Integer tanpa memicu exception, dan bentuknya adalah Integer.TryParse(teks, hasil). Metode ini mengembalikan True apabila teksnya berhasil dikonversi dan False apabila gagal, sedangkan variabel hasil menampung angka hasil konversi atau nol apabila gagal. Pola yang sama berlaku pada Double.TryParse untuk angka pecahan. Spasi di awal atau di akhir teks diabaikan, sehingga masukan yang kebetulan menyisakan spasi tetap berhasil dikonversi.

vb Contoh: perilaku Double.TryParse
Module ContohDouble

    Sub Main()
        Dim angka As Double

        Console.WriteLine(Double.TryParse("87.5", angka))
        Console.WriteLine(angka)
        Console.WriteLine(Double.TryParse("delapan", angka))
        Console.WriteLine(angka)
    End Sub

End Module
text Keluaran
True
87.5
False
0

Keluaran menegaskan dua perilakunya. Dua baris pertama memperlihatkan konversi berhasil dan variabel angka berisi 87.5, sedangkan dua baris terakhir memperlihatkan konversi gagal yang mengembalikan False dan mengosongkan variabel angka menjadi 0. Nilai kembalian Boolean itulah yang menjadi kendali keputusan, bukan isi variabel hasilnya.

Bandingkan dengan CInt("delapan") yang langsung memicu exception saat teksnya tidak sah, sehingga pola TryParse lebih tepat untuk masukan yang isinya belum pasti.

Pola validasi berulang#

Pola validasi meminta masukan berulang sampai nilainya sah, dan bentuknya adalah perulangan Do yang berisi TryParse beserta pemeriksaan rentang nilai. Perulangan berakhir melalui Exit Do tepat setelah masukan lolos seluruh pemeriksaan. Variabel nilai sengaja dideklarasikan di luar perulangan karena masih digunakan pada baris setelah Loop, tempat hasil validasi akhirnya ditampilkan.

vb Contoh: perulangan validasi dengan TryParse
Module ContohValidasi

    Sub Main()
        Dim nilai As Integer

        Do
            Console.Write("Masukkan nilai ujian: ")
            Dim baris As String = Console.ReadLine()
            If Integer.TryParse(baris, nilai) AndAlso nilai >= 0 AndAlso nilai <= 100 Then
                Exit Do
            End If
            Console.WriteLine("Nilai harus angka 0 sampai 100.")
        Loop

        Console.WriteLine($"Nilai tercatat: {nilai}")
    End Sub

End Module
text Keluaran
Masukkan nilai ujian: Nilai harus angka 0 sampai 100.
Masukkan nilai ujian: Nilai harus angka 0 sampai 100.
Masukkan nilai ujian: Nilai tercatat: 90

Masukan pada contoh adalah abc, 150, dan 90 secara berurutan. Dua masukan pertama ditolak, yaitu abc karena gagal TryParse dan 150 karena melewati batas atas, sedangkan masukan ketiga lolos seluruh rantai pemeriksaan.

Kesalahan umum#

Tiga kesalahan berikut paling sering muncul saat mengolah masukan console.

  1. Melakukan aritmetika langsung atas hasil ReadLine. Nilai kembaliannya bertipe String, sehingga penjumlahan terhadapnya ditolak compiler dan perbaikannya adalah konversi dengan TryParse terlebih dahulu.
  2. Menggunakan fungsi konversi seperti CInt pada teks yang belum pasti. Teks yang bukan angka memicu exception dan menghentikan program, sedangkan TryParse mengembalikan False yang dapat ditangani dengan tenang.
  3. Memproses baris tanpa memeriksa Nothing. Program yang membaca sampai akhir aliran tanpa pemeriksaan memicu NullReferenceException pada baris setelah terakhir, dan pola If baris Is Nothing menutup celah tersebut.

Ketiganya bermuara pada kebiasaan yang sama, yaitu memperlakukan setiap masukan sebagai belum pasti sampai berhasil dibaca dan dikonversi, sehingga program tetap berjalan utuh ketika masukannya salah.

Ringkasan#

  • Console.ReadLine mengembalikan satu baris masukan sebagai String dan mengembalikan Nothing ketika aliran masukan sudah habis.
  • Integer.TryParse dan Double.TryParse mengonversi teks menjadi angka dengan nilai kembalian Boolean sebagai penanda keberhasilan, tanpa memicu exception.
  • Variabel hasil TryParse berisi nol ketika konversi gagal, sehingga keputusan dibuat dari nilai kembalian metodenya dan bukan dari isi variabelnya.
  • Pola validasi menggunakan perulangan Do dengan rantai AndAlso yang menggabungkan TryParse dan pemeriksaan rentang nilai.

Referensi#