Kesalahan Semantik Java | Mengapa Programmer Java Harus Mengakui Kesalahan Semantik
Bergabunglah dengan API JAVA
Banyak orang menemukan perbedaan antara kesalahan semantik dan kesalahan sintaksis (sintaksis) dalam kode Java sulit dipahami, tetapi keduanya berbeda. Anda dapat melihat kesalahan semantik saat sintaks kode Anda benar tetapi penggunaan kodenya salah.
· Apa itu kesalahan semantik?
· Bagaimana kesalahan semantik terdeteksi?
· Kesalahan Semantik Umum
Apa itu kesalahan semantik?
Kesalahan semantik adalah masalah dalam kode Anda yang mencegah penafsir memahaminya. Mungkin tidak ada yang salah dengan logika yang Anda tulis, tetapi itu akan menyebabkan program mogok seperti yang Anda tulis. Misalnya, kode berikut akan memberikan hasil yang salah dalam Semantic runtime Error:
var a = 1 // No error
var b = 2 // No error
var c = 3 // No error
a + c = b
Kesalahan semantik terdeteksi pada waktu kompilasi, dan Anda dapat menganggapnya sebagai kesalahan analisis statis. Misalnya , jika Anda mencoba mengeksekusi variabel yang belum Anda deklarasikan, itu akan memunculkan kesalahan semantik: Kesalahan semantik terjadi ketika seorang programmer menulis kode yang gagal untuk mengkomunikasikan tujuan yang dimaksudkan. Ini berbeda dari kesalahan sintaksis, yang terjadi ketika kode benar secara sintaksis tetapi tidak menjalankan tugas yang dirancangnya.
Dengan kata lain, kesalahan semantik mengacu pada program yang salah yang menghasilkan hasil yang tidak masuk akal. Misalnya , jika aplikasi cuaca menyatakan “Hangat dan cerah” meskipun di luar sedang hujan, ini akan menjadi kesalahan semantik. Program tersebut tidak menghasilkan apa yang seharusnya diproduksi.
Bagaimana kesalahan semantik terdeteksi?
beberapa kesalahan semantik (kesalahan semantik statis) dideteksi oleh kompiler, yang menghasilkan pesan yang menunjukkan jenis kesalahan dan posisi di file sumber Java di mana kesalahan terjadi (perhatikan bahwa kesalahan sebenarnya bisa terjadi sebelum posisi ditandai oleh kompiler).
Pada titik ini, kami telah menjelaskan kesalahan semantik statis . Dalam setiap kasus, kompiler menandai kesalahan semantik statis ketika persyaratan bahasa pemrograman tidak terpenuhi (tipe tidak valid).
Ada jenis masalah lain: apa yang terjadi jika program Anda dikompilasi dan dijalankan, tetapi tidak melakukan apa yang Anda inginkan? Komputer melakukan persis seperti yang Anda programkan, tetapi apa yang Anda programkan salah. Ini adalah jenis kesalahan semantik lainnya: ketika pemrogram salah menggunakan bahasa pemrograman untuk menyelesaikan masalah.
Tidak seperti kesalahan semantik statis, kesalahan semantik dinamis berkaitan dengan makna. Jika suatu program berisi kesalahan semacam ini, program akan berhasil dijalankan, tetapi tidak akan menampilkan hasil yang benar.
Debugging tidak semudah itu dengan kesalahan semantik. Mari kita lihat contohnya.
/**
* This program prints the total benefit for the company
*
*/
public class TotalBenefit {
public static void main(String[] args) {
int branch1 = 250;
int branch2 = 500;
System.out.println("The total benefit is $" + (branch1 * branch2));
}
}
Kesalahan Semantik Umum
Kesalahan jenis tidak kompatibel
Kesalahan sintaksis ini sangat umum terjadi pada pemula. Dalam bahasa pemrograman terkompilasi seperti Java, Anda hanya dapat menetapkan nilai ke variabel yang kompatibel.
Kompatibel berarti mereka memiliki tipe yang sama atau, mereka memiliki tipe yang dapat dikonversi secara otomatis oleh kompiler.
Pada contoh di bawah ini Anda dapat melihat bahwa di Java, Anda tidak dapat menetapkan double ke variabel integer. Beberapa bahasa pemrograman mungkin melakukan konversi secara otomatis, tetapi jika Anda melihat kesalahan di bawah, perbaikannya sederhana. Ubah saja jenis variabel 'a', atau tetapkan nilai bilangan bulat alih-alih ganda (5.5).
Jenis kesalahan semantik ini bisa rumit karena kompiler akan menandai beberapa kesalahan dan bukan yang lain. Misalnya, jika Anda mencoba menetapkan float ke variabel int, kompiler akan menampilkan pesan kesalahan.
Di sisi lain, jika Anda menetapkan int ke variabel float, kompiler melakukan konversi tipe otomatis ke int untuk membuatnya menjadi float. Masalah dengan skenario kedua ini adalah dapat secara diam-diam menimbulkan kesalahan dalam kode Anda, terutama jika Anda benar-benar bermaksud menggunakan pelampung.
“variabel <X> mungkin belum diinisialisasi”
Ini terjadi ketika variabel lokal yang dideklarasikan dalam suatu metode belum diinisialisasi. Itu bisa terjadi ketika variabel tanpa nilai awal adalah bagian dari pernyataan if.
int x;
if (condition) {
x = 5;
}
System.out.println(x); // x may not have been initialized
Dimungkinkan untuk mengonversi antara berbagai jenis di Jawa. Namun, tidak peduli seberapa besar keinginan Anda untuk mengubah nilai boolean menjadi int, Java tidak akan membiarkan Anda melakukannya. Konsep melakukan pemeran secara sintaksis benar, tetapi Anda salah menerapkannya, menjadikannya kesalahan semantik yang selalu ditangkap oleh kompiler.
Kesalahan "tipe yang tidak dapat diubah" terjadi saat kode Java mencoba melakukan konversi ilegal.
TypeInvocationConversionTest.java:12: inconvertible types
found : java.util.ArrayList<java.lang.Class<? extends TypeInvocationConversionTest.Interface1>>
required: java.util.ArrayList<java.lang.Class<?>>
lessRestrictiveClassList = (ArrayList<Class<?>>) classList;
^
“variabel non-statis . . . tidak dapat dirujuk dari konteks statis”
Kesalahan ini terjadi saat kompiler mencoba mengakses variabel non-statis dari metode statis
public class StaticTest {
private int count=0;
public static void main(String args[]) throws IOException {
count++; //compiler error: non-static variable count cannot be referenced from a static context
}
}
- Deklarasikan variabel sebagai statis di tanda tangan.
- Periksa kode karena dapat membuat turunan dari objek non-statis dalam metode statis.
Masalah ini terjadi saat kode Java mencoba memanggil metode non-statis di kelas non-statis. Ini contohnya:
class Sample {
private int age;
public void setAge(int a) {
age=a;
}
public int getAge() {
return age;
}
public static void main(String args[]) {
System.out.println(“Age is:”+ getAge());
}
}
Exception in thread “main” java.lang.Error: Unresolved compilation problem:
Cannot make a static reference to the non–static method getAge() from the type Sample
Anda akan mendapatkan pesan “(array) <X> not initialized” ketika sebuah array telah dideklarasikan tetapi tidak diinisialisasi. Array memiliki panjang yang tetap sehingga setiap array perlu diinisialisasi dengan panjang yang diinginkan.
Kode berikut dapat diterima:
AClass[] array = {object1, object2}
As is:
AClass[] array = new AClass[2];
…
array[0] = object1;
array[1] = object2;
But not:
AClass[] array;
…
array = {object1, object2};
Masalah ini terjadi saat operator digunakan untuk tipe, bukan dalam definisinya.
Operator hanya ditentukan untuk tipe tertentu, meskipun konversi tipe implisit diperbolehkan antara tipe numerik tertentu:
int a = 5;
boolean b = true;
int c = a + b; // Error, can't add a boolean value double
d = a + 1.4; // OK, int is implicitly converted to double
Ini sering terjadi ketika kode Java mencoba menggunakan tipe string dalam perhitungan. Untuk memperbaikinya, string perlu diubah menjadi integer atau float.
Kemungkinan hilangnya presisi
Terkadang Anda dapat menerapkan casting secara tidak benar. Misalnya, melemparkan float ke int berfungsi dengan baik, tetapi dengan kehilangan bagian desimal dari angka tersebut.
"Kemungkinan kehilangan presisi" terjadi ketika lebih banyak informasi yang diberikan ke variabel daripada yang dapat ditampungnya. Jika ini terjadi, potongan akan dibuang. Jika ini baik-baik saja, maka kode perlu mendeklarasikan variabel secara eksplisit sebagai tipe baru.
Kesalahan ini muncul ketika mencoba menetapkan nilai dengan presisi lebih tinggi ke variabel dengan presisi lebih rendah tanpa pemeran tipe eksplisit. Anehnya, mungkin, literal floating point bertipe doubledan Anda akan mendapatkan pesan ini jika Anda mencoba menetapkan satu ke variabel bertipe float:
float sum = 0.0; // Error, literal is not of type float
float sum = 0.0f; // OK float sum = (float) 0.0; // OK
Hilangnya presisi ini dapat memengaruhi keluaran aplikasi Anda dengan cara yang tidak terduga dan menyebabkan keluaran mencerminkan nilai selain yang Anda harapkan. Kompiler tidak pernah menemukan kesalahan semacam ini karena Anda telah secara khusus menerapkan gips ke variabel dan kompiler berharap Anda tahu apa yang Anda lakukan.
Menerapkan pelingkupan secara tidak benar
Variabel apa pun yang Anda deklarasikan di dalam metode memiliki cakupan yang sama — visibilitas ke bagian lain aplikasi, dengan kata lain — sebagai metode. Akibatnya, Anda tidak dapat mendeklarasikan variabel int statis pribadi di dalam metode. Sebagai gantinya, Anda harus mendefinisikan variabel secara global seperti ini:
public class PrivateVar
{
// This declaration works.
private static int PrivateInt = 3;
public static void main(String[] args)
{
// This declaration doesn’t work.
private static int PrivateInt = 3;
}
}
Berikut adalah beberapa kasus kesalahan semantik umum lainnya di Jawa
Type mismatches — Ada banyak cara untuk menggunakan tipe yang salah di C#. Contoh di atas adalah salah satu caranya. Berikut adalah beberapa cara lain yang mungkin:
- Melewati jenis nilai yang salah ke suatu metode.
- Mengembalikan jenis nilai yang salah dari suatu metode.
- Menetapkan jenis nilai yang salah pada properti.
- Mengatur jenis nilai yang salah pada bidang.
- Menetapkan jenis nilai yang salah pada variabel lokal.
- Menggunakan tipe dalam daftar argumen generik yang tidak sesuai dengan batasan tipe generik.
- Meneruskan jumlah argumen yang salah ke pemanggilan metode.
- Meneruskan jumlah indeks yang salah ke array atau pengindeks.
- Menggunakan jumlah argumen tipe generik yang salah untuk tipe atau metode generik.
- Menggunakan nama yang tidak ditentukan — Menggunakan namespace, tipe, metode, bidang, variabel, atau nama properti yang tidak ada.
- Mendefinisikan dua jenis dalam namespace yang sama dengan nama yang sama
- Mendefinisikan dua metode dalam kelas yang sama dengan daftar argumen dan nama yang sama.
- Menentukan properti, bidang, atau tipe bersarang yang memiliki nama yang sama dengan properti, bidang, atau tipe bersarang lainnya dalam tipe kepemilikan yang sama.
- Mendefinisikan dua variabel lokal dalam lingkup yang sama atau keturunan dengan nama yang sama.
Dukung publikasi kami dengan mengikutinya
Spring 3.0 dan Fitur-Fiturnya Pertanyaan Wawancara Berbasis Java8 Stream yang Paling Sering Ditanyakan — Bagian Akhir Semaphore | Java Concurrent API Bagaimana ChatGPT Akan Mengubah SEO : Tunjangan & Tantangan Apa Penyebab Kesalahan Sintaks Dan Cara Menghindarinya| Bagaimana Java Compiler Mendeteksi Kesalahan Sintaks … Panduan Lengkap untuk Membangun Platform ICO Label Putih Sebagai Orang Asing Membantu Saya Memahami Kebenaran Menyedihkan dari Komunikasi Modern Revolusi AI: Akankah AI menjadi satu-satunya Penulis di Sedang? Saya tidak melihat saya adalah seorang penulis top di Medium RestTemplate | FeignClient | Klien Web Dengan Boot Musim Semi Cara Membuat Proyek Quarkus Sederhana dengan Pengodean Integrasi Basis Data: Meratakan array dalam Javascript Mengotomatiskan Pemasaran Media Sosial dengan ChatGPT 10 Widget Setiap Pengembang Flutter Harus Menguasai Merevolusi Pembelajaran Anda dengan Ingatan Aktif: Metode Terbukti untuk Mempertahankan Informasi untuk…
![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































