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.
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 ModuleNama: 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.
# tidak-dijalankan
# menjalankan program dengan masukan yang disalurkan lewat pipe
printf "Budi\n35\n" | dotnet run$ 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.
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 Module1: satu
2: duaSetelah 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.
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 ModuleTrue
87.5
False
0Keluaran 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.
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 ModuleMasukkan nilai ujian: Nilai harus angka 0 sampai 100.
Masukkan nilai ujian: Nilai harus angka 0 sampai 100.
Masukkan nilai ujian: Nilai tercatat: 90Masukan 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.
- Melakukan aritmetika langsung atas hasil
ReadLine. Nilai kembaliannya bertipeString, sehingga penjumlahan terhadapnya ditolak compiler dan perbaikannya adalah konversi denganTryParseterlebih dahulu. - Menggunakan fungsi konversi seperti
CIntpada teks yang belum pasti. Teks yang bukan angka memicu exception dan menghentikan program, sedangkanTryParsemengembalikanFalseyang dapat ditangani dengan tenang. - Memproses baris tanpa memeriksa
Nothing. Program yang membaca sampai akhir aliran tanpa pemeriksaan memicuNullReferenceExceptionpada baris setelah terakhir, dan polaIf baris Is Nothingmenutup 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.ReadLinemengembalikan satu baris masukan sebagaiStringdan mengembalikanNothingketika aliran masukan sudah habis.Integer.TryParsedanDouble.TryParsemengonversi teks menjadi angka dengan nilai kembalianBooleansebagai penanda keberhasilan, tanpa memicu exception.- Variabel hasil
TryParseberisi nol ketika konversi gagal, sehingga keputusan dibuat dari nilai kembalian metodenya dan bukan dari isi variabelnya. - Pola validasi menggunakan perulangan
Dodengan rantaiAndAlsoyang menggabungkanTryParsedan pemeriksaan rentang nilai.
Referensi#
- Console.ReadLine Method — Microsoft Learn — Perilaku pembacaan baris dan nilai kembalian Nothing.
- Int32.TryParse Method — Microsoft Learn — Konversi teks menjadi bilangan bulat tanpa exception.
- Double.TryParse Method — Microsoft Learn — Konversi teks menjadi bilangan pecahan beserta aturan budayanya.
- Console Class — Microsoft Learn — Kelompok anggota kelas Console untuk masukan dan keluaran standar.