NaN, Infinity, dan Divide by Zero di VB.NET

Buku-buku pemrograman awal biasanya menyertakan peringatan ini: "Jangan membaginya dengan nol! Anda akan mendapatkan kesalahan runtime! "

Banyak hal telah berubah VB.NET. Meskipun ada lebih banyak pemrograman pilihan dan perhitungannya lebih akurat, tidak selalu mudah untuk melihat mengapa sesuatu terjadi seperti yang mereka lakukan.

Di sini, kita belajar bagaimana menangani pembagian dengan nol menggunakan penanganan kesalahan terstruktur VB.NET. Dan sepanjang jalan, kita juga membahas konstanta VB.NET baru: NaN, Infinity, dan Epsilon.

Apa Yang Terjadi Jika Anda Menjalankan 'Divide By Zero' di VB.NET

Jika Anda menjalankan skenario 'bagi dengan nol' di VB.NET, Anda mendapatkan hasil ini:

 Dim a, b, c As Double

 a = 1: b = 0

 c = a / b

 Menghibur. WriteLine (_

 "Miliki aturan matematika" _

 & vbCrLf & _

 "Dicabut?" _

 & vbCrLf & _

 "Pembagian dengan nol" _

 & vbCrLf & _

 "Harus mungkin!") 

Jadi apa yang terjadi di sini? Jawabannya adalah bahwa VB.NET sebenarnya memberi Anda jawaban yang benar secara matematis. Secara matematis, Anda

instagram viewer
bisa bagi dengan nol, tetapi yang Anda dapatkan adalah "tak terbatas".

 Dim a, b, c As Double

 a = 1: b = 0

 c = a / b

 Menghibur. WriteLine (_

 "Jawabannya adalah: " _

 & c)

 'Menampilkan:

 'Jawabannya adalah: tak terbatas 

Nilai "tak terbatas" tidak terlalu berguna untuk sebagian besar aplikasi bisnis. (Kecuali CEO bertanya-tanya apa batas atas dari bonus sahamnya.) Tetapi itu membuat aplikasi Anda tidak crash pada pengecualian runtime seperti bahasa yang kurang kuat.

VB.NET memberi Anda fleksibilitas lebih dengan bahkan memungkinkan Anda untuk melakukan perhitungan. Lihat ini:

 Dim a, b, c As Double

 a = 1: b = 0

 c = a / b

 c = c +1

 'Infinity plus 1 adalah

 masih tak terbatas 

Agar tetap benar secara matematis, VB.NET memberi Anda jawaban NaN (Bukan Angka) untuk beberapa perhitungan seperti 0/0.

 Dim a, b, c As Double

 a = 0: b = 0

 c = a / b

 Menghibur. WriteLine (_

 "Jawabannya adalah: " _

 & c)

 'Menampilkan:

 'Jawabannya adalah: NaN 

VB.NET juga dapat membedakan antara infinity positif dan infinity negatif:

 Dim a1, a2, b, c As Double

 a1 = 1: a2 = -1: b = 0

 Jika (a1 / b)> (a2 / b) Lalu _

 Menghibur. WriteLine (_

 "Postive infinity is" _

 & vbCrLf & _

 "lebih besar dari" _

 & vbCrLf & _

 "Tak terhingga negatif.") 

Selain PositiveInfinity dan NegativeInfinity, VB.NET juga menyediakan Epsilon, nilai Double positif terkecil yang lebih besar dari nol.

Perlu diingat bahwa semua kemampuan baru VB.NET ini hanya tersedia dengan tipe data floating point (Double atau Single). Dan fleksibilitas ini dapat menyebabkan kebingungan Try-Catch-Akhirnya (penanganan kesalahan terstruktur). Sebagai contoh, kode .NET di atas berjalan tanpa membuang pengecualian, jadi mengkodekannya di dalam blok Coba-Tangkap-Akhirnya tidak akan membantu. Untuk menguji pembagian dengan nol, Anda harus membuat kode pengujian seperti:

 Jika c. ToString = "Infinity" Lalu... 

Bahkan jika Anda membuat kode program (menggunakan Integer sebagai ganti tipe Single atau Double), Anda masih mendapatkan pengecualian "Overflow", bukan pengecualian "Divide by Zero". Jika Anda mencari bantuan teknis lainnya di web, Anda akan melihat bahwa semua contoh pengujian untuk OverflowException.

.NET sebenarnya memiliki DivideByZeroException sebagai jenis yang sah. Tetapi jika kode tidak pernah memicu pengecualian, kapan Anda akan melihat kesalahan yang sulit dipahami ini?

Ketika Anda Akan Melihat DivideByZeroException

Ternyata, MicrosoftHalaman MSDN tentang Try-Catch-Akhirnya blok benar-benar menggunakan membagi dengan nol contoh untuk menggambarkan cara kode mereka. Tapi ada "tangkapan" halus yang tidak mereka jelaskan. Kode mereka terlihat seperti ini:

 Dim a As Integer = 0

 Dim b As Integer = 0

 Dim c As Integer = 0


 Mencoba

 a = b \ c

 Tangkap exc As Exception

 Menghibur. WriteLine ("Terjadi kesalahan run-time")

 Akhirnya

 Menghibur. ReadLine ()

 Akhiri Coba 

Kode ini tidak memicu kesenjangan yang sebenarnya dengan pengecualian nol.

Tetapi mengapa kode ini memicu pengecualian dan tidak ada yang kami kodekan sebelumnya? Dan apa yang tidak dijelaskan oleh Microsoft?

Perhatikan bahwa operasi yang mereka gunakan adalah tidak bagi ("/"), itu adalah pembagian integer ("\")! (Contoh Microsoft lainnya sebenarnya mendeklarasikan variabel sebagai Integer.) Ternyata, perhitungan integer adalah hanya kasus yang benar-benar melempar pengecualian itu. Akan lebih baik jika Microsoft (dan halaman lain yang menyalin kode mereka) menjelaskan sedikit detail.

instagram story viewer