Java programı nasıl derlenir ve çalışır
Kaynak koddan bytecode'a, JVM'den ekrana: javac/java zinciri, ilk programın anatomisi ve üç hata türü. Vizede boşluk doldurma ve kısa çıktı sorusu olarak gelir.
Java’da yazdığın her program iki aşamadan geçer: önce derlenir (compile), sonra çalıştırılır (run). Bu ayrımı bilmek iki yerde puan getirir: vizedeki boşluk doldurma soruları (javac, bytecode, JVM) ve “bu hata hangi tür?” soruları. Bir de print ile println farkı var; neredeyse her çıktı sorusunun içinde gizlidir.
Altın kurallar:
.java→javac→.class→java→ JVM. Bu zinciri ezbere bil.- public sınıfın adı = dosya adı.
public class HelloancakHello.javaiçinde olur. - Program
mainmetodundan başlar ve satırlar yukarıdan aşağı sırayla çalışır. printsatırda kalır,printlnalt satıra geçer.- Derleyici sadece yazım ve tip hatalarını bulur. Mantık hatasını (logic error) asla bulamaz.
Kaynak koddan çalışan programa
Bilgisayarın işlemcisi Java kodunu doğrudan anlamaz. Arada iki adım var.
| Adım | Ne olur | Komut | Sonuç |
|---|---|---|---|
| 1. Yaz | Kodu bir metin dosyasına yazarsın | (editör, IDE) | Hello.java (kaynak kod, source code) |
| 2. Derle | Derleyici (compiler) kodu kontrol eder ve çevirir | javac Hello.java | Hello.class (bytecode) |
| 3. Çalıştır | JVM bytecode’u yükler ve çalıştırır | java Hello | ekrandaki çıktı |
Bytecode makine kodu değildir. Java’nın kendi ara dilidir. Bu yüzden aynı .class dosyası Windows’ta da, macOS’ta da, Linux’ta da çalışır: her sistemde o sisteme uygun bir JVM (Java Virtual Machine) vardır ve bytecode’u yerinde çevirir. Java’nın “bir kez yaz, her yerde çalıştır” (write once, run anywhere) sloganı buradan gelir.
Kısaltmaları karıştırma:
| Kısaltma | Açılımı | İçinde ne var |
|---|---|---|
| JVM | Java Virtual Machine | bytecode’u çalıştıran sanal makine |
| JRE | Java Runtime Environment | JVM + standart kütüphaneler (çalıştırmak için yeter) |
| JDK | Java Development Kit | JRE + javac ve geliştirme araçları (kod yazmak için gerekir) |
İPUCU · tek dosyayı doğrudan çalıştırmak. Yeni JDK’larda
java Hello.javakomutu dosyayı arka planda derleyip hemen çalıştırır. Pratikte işini görür ama sınavda zinciri iki ayrı komutla yaz: öncejavac Hello.java, sonrajava Hello.
İlk programın anatomisi
public class Hello {
public static void main(String[] args) {
System.out.println("Merhaba, Java!");
}
}
Merhaba, Java!
Satır satır:
public class Hellobir sınıf (class) tanımlar. Java’da her kod bir sınıfın içinde yaşar. Sınıf adı büyük harfle başlar (gelenek). public olduğu için dosya adıHello.javaolmak zorunda.{ve}bir blok açar ve kapatır. Her açılan süslü parantezin bir kapanışı olmalı.public static void main(String[] args)programın giriş noktası (entry point). JVM programı başlatınca bu metodu arar. Kelimesi kelimesine böyle yazılır. Şimdilik ezberle;staticvevoid5. haftada anlam kazanacak.System.out.println(...)parantez içindekini ekrana yazar. Bu satır bir ifade (statement) ve sonunda;var. Java’da her ifade noktalı virgülle biter.
Java büyük/küçük harfe duyarlıdır (case-sensitive). system.out.println yazarsan derlenmez; derleyici package system does not exist der. Main ile main farklı isimlerdir.
print, println ve kaçış dizileri
System.out.print("Bir ");
System.out.print("iki ");
System.out.println("uc");
System.out.println("dort");
Bir iki uc
dort
print metni yazar ve imleci (cursor) olduğu yerde bırakır. println metni yazar ve satırı bitirir, yani bir sonraki çıktı alt satırdan başlar. print boşluk eklemez; kelimeler arasında boşluk istiyorsan metnin içine koyacaksın.
String’in içine özel karakter koymak için kaçış dizisi (escape sequence) kullanılır. Hepsi ters bölü \ ile başlar:
| Kaçış dizisi | Anlamı |
|---|---|
\n | yeni satır (newline) |
\t | tab (yatay sekme) |
\" | çift tırnak karakteri |
\\ | tek bir ters bölü |
System.out.println("Ad\tSoyad");
System.out.println("Satir1\nSatir2");
System.out.println("Hoca \"tamam\" dedi");
System.out.println("C:\\Users\\deniz");
Ad Soyad
Satir1
Satir2
Hoca "tamam" dedi
C:\Users\deniz
TUZAK · tek ters bölü.
"C:\Users"derlenmez:\Ugeçerli bir kaçış dizisi değil, derleyiciillegal escape characterder. Dosya yolu yazarken her ters bölüyü ikiye katla.
Yorumlar
Yorum (comment) derleyicinin tamamen yok saydığı açıklamadır. İki türü var:
// System.out.println("gizli"); tek satır yorum
System.out.println("gorunur"); /* System.out.println("bu da gizli"); */
gorunur
// satırın sonuna kadar her şeyi yorum yapar. /* ... */ arasındaki her şey, birden fazla satır sürse bile yorumdur. Sınavda “what is printed?” sorusunda yorumdaki println satırlarını atla; hiç yazılmamış gibi.
Üç hata türü
Sınavın klasik kısa sorusu: “Bu hata compile-time mı, runtime mı, logic mi?” Ayırt etmenin yolu, hatanın ne zaman ortaya çıktığına bakmak.
Derleme hatası (compile-time error)
javac kodu çevirirken bulur. Program hiç oluşmaz, dolayısıyla hiç çalışmaz. Yazım (syntax) hataları ve tip hataları buraya girer.
public class Hello {
public static void main(String[] args) {
System.out.println("Hi")
}
}
Hello.java:3: error: ';' expected
System.out.println("Hi")
^
1 error
Diğer sık örnekler: tanımlanmamış değişken (cannot find symbol), yanlış dosya adı (class Greet is public, should be declared in a file named Greet.java), double’ı int’e atamak (possible lossy conversion), kapanmamış süslü parantez.
Çalışma zamanı hatası (runtime error)
Kod derlenir, program başlar, ama çalışırken bir satırda imkânsız bir iş yapılınca çöker. Java buna exception der.
System.out.println("start");
System.out.println(10 / 0);
System.out.println("end");
start
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Div.main(Div.java:4)
Çökmeden önceki satırlar çalışmıştır (start basıldı). Çöktüğü satırdan sonrası çalışmaz (end yok). İleride göreceğin başka örnekler: dizinin dışına çıkmak (ArrayIndexOutOfBoundsException), Scanner’a sayı yerine harf girmek (InputMismatchException).
Mantık hatası (logic error)
Program derlenir, çalışır, çökmez ama yanlış sonuç verir. En sinsi tür, çünkü kimse uyarmaz.
int x = 4, y = 6;
double avg = x + y / 2; // niyet: ortalama
System.out.println(avg);
7.0
Ortalama 5.0 olmalıydı. Bölme toplamadan önce yapıldı: 4 + 6 / 2 = 4 + 3. Düzeltme (x + y) / 2.0. Bu tür hataları ancak elle test ederek (bildiğin bir örnekle sonucu karşılaştırarak) bulursun.
| Hata türü | Ne zaman? | Program çalışır mı? | Örnek |
|---|---|---|---|
| Compile-time | javac sırasında | Hayır, .class oluşmaz | ; eksik, totl yazım hatası |
| Runtime | Çalışırken | Başlar, hatalı satırda çöker | 10 / 0 |
| Logic | Hiçbir zaman “hata” vermez | Evet, sonuna kadar | yanlış formül |
Çözümlü örnek: hata mesajı okumak
javac’ın mesajı her zaman aynı kalıptadır: DosyaAdı.java:satır: error: açıklama, altında hatalı satır ve bir ^ işareti. Aşağıdaki programda iki hata var:
public class Typo {
public static void main(String[] args) {
int total = 5;
System.out.println(totl);
system.out.println("x");
}
}
Typo.java:4: error: cannot find symbol
System.out.println(totl);
^
symbol: variable totl
location: class Typo
Typo.java:5: error: package system does not exist
system.out.println("x");
^
2 errors
Okuma sırası: önce satır numarasına git (4), ^ işaretinin gösterdiği kelimeye bak (totl), sonra açıklamayı oku (cannot find symbol: bu isimde bir şey tanımlı değil). Düzeltme total. İkinci hata küçük harfle yazılmış system; Java büyük/küçük harfe duyarlı olduğu için onu bir paket adı sandı. Mesajlar bazen dolaylıdır ama satır numarası neredeyse her zaman doğru yeri gösterir. Birden çok hata varsa en üsttekinden başla: ilk hatayı düzeltmek çoğu zaman aşağıdakileri de kaybettirir.
Sık yapılan hatalar
| Yanlış düşünce | Doğrusu |
|---|---|
java Hello.class ile çalıştırılır | java Hello, uzantı yazılmaz |
javac programı çalıştırır | javac sadece derler, çalıştıran JVM’dir (java) |
| Bytecode makine kodudur | Ara dildir, JVM her sistemde onu çevirir |
| Dosya adı önemli değil | public sınıf adı ile dosya adı birebir aynı olmalı |
print("a"); print("b"); → a b | ab, print boşluk eklemez |
\\ iki ters bölü basar | Tek ters bölü basar |
Yorumdaki println de çalışır | Yorumlar tamamen yok sayılır |
| Derleyici her hatayı bulur | Mantık hatasını bulamaz |
| Exception = derleme hatası | Exception çalışırken olur: runtime error |
Kendini test et
Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.
What is printed?
System.out.print("Java");
System.out.print("Code");
System.out.println("!");Cevabı göster
print yazar ve imleci aynı satırda bırakır. İki print yan yana yazılır, boşluk eklenmez. En sondaki println ünlem işaretini yazıp satırı bitirir.
What is printed?
System.out.println("A");
System.out.print("B");
System.out.println();
System.out.println("C");Cevabı göster
B
C
println("A") yazar ve alt satıra geçer. print("B") yazar, satırda kalır. Boş println() sadece satırı bitirir. Sonra C yeni satırda. Toplam üç satır, boş satır yok.
What is printed?
System.out.println("1\t2\n3");Cevabı göster
3
\t bir tab (sekme) boşluğu, \n yeni satır karakteridir. Önce 1, tab, 2 yazılır; \n ile alt satıra geçilip 3 yazılır.
What is printed?
System.out.println("She said \"hi\"");Cevabı göster
\" kaçış dizisi (escape sequence) String'in içine çift tırnak koyar. Ters bölü ekrana basılmaz, sadece tırnak görünür.
What is printed?
System.out.println("C:\\new\\test");Cevabı göster
Kodda \\ iki karakter görünür ama tek bir ters bölü basar. Yani n ve t burada sıradan harftir, yeni satır ya da tab oluşmaz. Tek ters bölü yazsaydın (\n) gerçekten yeni satır olurdu.
What is printed?
System.out.print("x");
// System.out.print("y");
System.out.print("z"); /* System.out.print("w"); */
System.out.println();Cevabı göster
// satırın geri kalanını, /* ... */ aradaki her şeyi yorum (comment) yapar. Derleyici yorumları tamamen yok sayar, y ve w hiç çalışmaz.
What is printed?
System.out.println("Line 1");
System.out.print("Line 2\n");
System.out.print("Line 3");
System.out.println(" end");Cevabı göster
Line 2
Line 3 end
print("Line 2\n") sonunda \n olduğu için println gibi davranır. Line 3 satırda kalır, sonraki println(" end") başında boşluk olan metni aynı satıra ekler.
Fill in the blanks: A file Hello.java is compiled with the command ____, which produces the file ____ containing bytecode. The bytecode is executed by the ____ using the command java Hello.
Cevabı göster
Zincir: kaynak kod (.java) → javac derleyicisi → bytecode (.class) → java komutu JVM'i başlatır ve bytecode'u çalıştırır. Çalıştırırken .class uzantısı yazılmaz: java Hello.
A file named Main.java contains public class Greet { ... }. What happens when you compile it?
- It compiles and runs normally
- Compile-time error: class Greet is public, should be declared in a file named Greet.java
- Runtime error when the program starts
- It compiles but prints nothing
Cevabı göster
public bir sınıfın adı dosya adıyla birebir aynı olmalı (büyük/küçük harf dahil). javac bunu derleme anında yakalar: class Greet is public, should be declared in a file named Greet.java.
Classify each error as compile-time, runtime or logic error: (a) missing ; at the end of a statement, (b) System.out.println(10 / 0);, (c) writing System.out.println(totl); when the variable is named total, (d) a program that should print the area of a rectangle but prints the perimeter.
Cevabı göster
(a) ';' expected, program hiç derlenmez. (b) derlenir, çalışırken ArithmeticException: / by zero ile çöker. (c) cannot find symbol, derleyici tanımadığı ismi yakalar. (d) program çalışır ve çökmez ama yanlış sonuç verir: mantık hatası (logic error). Derleyici bunu asla bulamaz.
What is printed? Is this a compile-time, runtime or logic error?
int x = 4, y = 6;
double avg = x + y / 2;
System.out.println(avg);Cevabı göster
/ toplamadan önce yapılır: y / 2 = 3, sonra 4 + 3 = 7, double'a atanınca 7.0. Ortalama 5.0 olmalıydı. Program derlenip çalıştığı için bu bir mantık hatası. Doğrusu (x + y) / 2.0.
The program below prints start and then crashes. What kind of error is it, and does end get printed?
System.out.println("start");
System.out.println(10 / 0);
System.out.println("end");Cevabı göster
Kod derlenir. Çalışırken ilk satır start basar, ikinci satırda tam sayıyı sıfıra bölmek ArithmeticException: / by zero fırlatır ve program orada durur. Çökme noktasından sonraki satırlar çalışmaz.
Doğrulama: Tüm çıktılar JDK 26 ile çalıştırıldı (verify/SEN1001/W01.java). Derleme hatası mesajları verify/SEN1001/err/ altındaki dosyalar javac ile derlenerek alındı.