SEN1001 · 1. hafta · Introduction

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.

source codecompilerjavacbytecodeJVM (Java Virtual Machine)JDKJREclassmain methodstatementescape sequencecommentcompile-time errorruntime errorlogic error

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:

  1. .java → javac → .class → java → JVM. Bu zinciri ezbere bil.
  2. public sınıfın adı = dosya adı. public class Hello ancak Hello.java içinde olur.
  3. Program main metodundan başlar ve satırlar yukarıdan aşağı sırayla çalışır.
  4. print satırda kalır, println alt satıra geçer.
  5. 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ımNe olurKomutSonuç
1. YazKodu bir metin dosyasına yazarsın(editör, IDE)Hello.java (kaynak kod, source code)
2. DerleDerleyici (compiler) kodu kontrol eder ve çevirirjavac Hello.javaHello.class (bytecode)
3. ÇalıştırJVM bytecode’u yükler ve çalıştırırjava Helloekrandaki çı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ısaltmaAçılımıİçinde ne var
JVMJava Virtual Machinebytecode’u çalıştıran sanal makine
JREJava Runtime EnvironmentJVM + standart kütüphaneler (çalıştırmak için yeter)
JDKJava Development KitJRE + javac ve geliştirme araçları (kod yazmak için gerekir)

İPUCU · tek dosyayı doğrudan çalıştırmak. Yeni JDK’larda java Hello.java komutu dosyayı arka planda derleyip hemen çalıştırır. Pratikte işini görür ama sınavda zinciri iki ayrı komutla yaz: önce javac Hello.java, sonra java 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 Hello bir 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.java olmak 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; static ve void 5. 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.

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çış dizisiAnlamı
\nyeni satır (newline)
\ttab (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: \U geçerli bir kaçış dizisi değil, derleyici illegal escape character der. 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-timejavac sırasındaHayır, .class oluşmaz; eksik, totl yazım hatası
RuntimeÇalışırkenBaşlar, hatalı satırda çöker10 / 0
LogicHiçbir zaman “hata” vermezEvet, sonuna kadaryanlış 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üşünceDoğrusu
java Hello.class ile çalıştırılırjava Hello, uzantı yazılmaz
javac programı çalıştırırjavac sadece derler, çalıştıran JVM’dir (java)
Bytecode makine kodudurAra dildir, JVM her sistemde onu çevirir
Dosya adı önemli değilpublic sınıf adı ile dosya adı birebir aynı olmalı
print("a"); print("b"); → a bab, print boşluk eklemez
\\ iki ters bölü basarTek ters bölü basar
Yorumdaki println de çalışırYorumlar tamamen yok sayılır
Derleyici her hatayı bulurMantı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ç.

Soru 1kolay

What is printed?

System.out.print("Java");
System.out.print("Code");
System.out.println("!");
Cevabı göster
JavaCode!

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.

Soru 2kolay

What is printed?

System.out.println("A");
System.out.print("B");
System.out.println();
System.out.println("C");
Cevabı göster
A
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.

Soru 3kolay

What is printed?

System.out.println("1\t2\n3");
Cevabı göster
1 2
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.

Soru 4kolay

What is printed?

System.out.println("She said \"hi\"");
Cevabı göster
She said "hi"

\" 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.

Soru 5orta

What is printed?

System.out.println("C:\\new\\test");
Cevabı göster
C:\new\test

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.

Soru 6kolay

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
xz

// satırın geri kalanını, /* ... */ aradaki her şeyi yorum (comment) yapar. Derleyici yorumları tamamen yok sayar, y ve w hiç çalışmaz.

Soru 7orta

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 1
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.

Soru 8kolay

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
javac Hello.java · Hello.class · JVM

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.

Soru 9orta

A file named Main.java contains public class Greet { ... }. What happens when you compile it?

  1. It compiles and runs normally
  2. Compile-time error: class Greet is public, should be declared in a file named Greet.java
  3. Runtime error when the program starts
  4. It compiles but prints nothing
Cevabı göster
b

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.

Soru 10orta

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) compile-time · (b) runtime · (c) compile-time · (d) logic

(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.

Soru 11zor

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
7.0 (logic error)

/ 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.

Soru 12orta

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
Runtime error (ArithmeticException); end is NOT printed

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ı.

Deftere not kartı

Hello.java --javac--> Hello.class (bytecode) --java--> JVM çalıştırır javac Hello.java derle java Hello çalıştır (.class yazılmaz) JDK = javac + araçlar + JRE JRE = JVM + kütüphaneler public class Adı = dosya adı (Hello.java), büyük/küçük harf dahil Program main'den başlar: public static void main(String[] args) Her ifade ; ile biter. { } blok açar/kapar. Java büyük/küçük harf duyarlı print = yaz, satırda kal println = yaz + alt satır println() = boş satır sonu \n yeni satır \t tab \" tırnak \\ ters bölü // tek satır yorum /* ... */ çok satır yorum (çalışmaz) Compile-time: ; eksik, yanlış isim, tip uyuşmazlığı → hiç çalışmaz Runtime: derlenir, çalışırken çöker (10/0 → ArithmeticException) Logic: çalışır, çökmez, YANLIŞ sonuç (derleyici bulamaz)