Java’da public class hatası alıyorsanız ilk kontrol etmeniz gereken şey, dosya adı ile public sınıf adının birebir aynı olup olmadığıdır. Örneğin kodda public class Main yazıyorsa dosyanın adı uzantısıyla birlikte Main.java olmalıdır. Main, main ve MAIN Java açısından aynı ad değildir.
Bu kuralı kontrol ettikten sonra teşhisi beş parçaya ayırmak gerekir: dosya adı, sınıf adı, aynı dosyadaki public sınıf sayısı, package ile klasör uyumu ve çalıştırılan javac/java komutlarının konumu. İlk iki kontrol çoğu başlangıç düzeyindeki derleme hatasının kaynağını ortaya çıkarır.
Hata Mesajı Ne Anlatır: public class ve Dosya Adı Kuralı
Java’da dosyanın en üst seviyesinde tanımlanan bir sınıf public ise, sınıfın adı ile .java dosyasının adı aynı olmak zorundadır. Bu nedenle aşağıdaki sınıf yalnızca Main.java adlı dosyada bulunmalıdır:
public class Main {
public static void main(String[] args) {
System.out.println("Program çalıştı.");
}
}
Bu dosyayı örneğin Odev.java adıyla kaydederseniz derleyici, dosyanın beklenen adla eşleşmediğini bildirir. Hata mesajlarında genellikle class Main bölümü kodda bulunan sınıfı, file named Main.java bölümü ise derleyicinin beklediği dosya adını gösterir. Yani mesajdaki iki adı ayrı ayrı okuyun: biri sınıf bildiriminin adıdır, diğeri dosyanın sahip olması gereken addır.
Java büyük-küçük harfe duyarlıdır. Aşağıdaki adlar üç farklı sınıf adı olarak kabul edilir:
MainmainMAIN
Dolayısıyla public class Main için doğru dosya adı Main.java olur. main.java veya MAIN.java kullanmak bazı dosya sistemlerinde ayrıca sorun çıkarabilir. Özellikle büyük-küçük harfe duyarlı ortamlarda bu fark, yalnızca görüntüleme biçimi değil, gerçek bir ad uyuşmazlığıdır.
Bir .java dosyasında yalnızca bir top-level public sınıf bulunabilir. Ancak yardımcı sınıflar public olmadan aynı dosyaya eklenebilir:
public class Main {
public static void main(String[] args) {
Mesaj yazici = new Mesaj();
yazici.yaz();
}
}
class Mesaj {
void yaz() {
System.out.println("Merhaba Java");
}
}
Burada dosyanın adı Main.java olmalıdır. Mesaj sınıfı aynı dosyada yer alabilir; çünkü public değildir. Buna karşılık aynı dosyada hem public class Main hem de public class Mesaj tanımlamak, iki farklı dosya adı gerektireceği için geçerli değildir.
Yanlış Dosya Adı ve Büyük-Küçük Harf Hatası Nasıl Düzeltilir?

İlk teşhis adımında dosya adı ile public sınıf adını sistematik biçimde karşılaştırın. Örneğin dosyanızın adı Odev.java, içeriği ise şu olsun:
public class Main {
public static void main(String[] args) {
System.out.println("İlk Java programım");
}
}
Bu durumda yapılacak işlem sırası şöyledir:
- Dosyanın içindeki sınıf bildirimini bulun.
public classifadesinden sonra gelen adı okuyun:Main.- Dosyayı uzantısını koruyarak
Main.javaadıyla yeniden adlandırın. - Aynı klasördeki eski
.classdosyalarını temizleyin. - Dosyayı yeniden derleyin:
javac Main.java.
Derleme başarılı olduğunda hata metni yerine aynı klasörde Main.class dosyasının oluşması beklenir. Programı çalıştırırken ise uzantı yazılmaz: java Main. java Main.java ile java main komutlarını birbirine karıştırmak, dosya adı düzeltilmiş olsa bile yeni bir çalıştırma hatasına yol açabilir.
Dosya adını değiştirirken yalnızca yazılış biçimine bakmayın. Main.java ile main.java arasındaki farkı özellikle dosya sisteminin büyük-küçük harfe duyarlı olduğu ortamlarda açıkça kontrol edin. IDE dosya sekmesinde doğru ad görünse bile terminalde bulunduğunuz klasörde eski bir dosya kalmış olabilir.
Bu adımların yanında sınıf, dosya ve terminal konumlarını birlikte kontrol etmekte zorlanıyorsanız, adım adım Java hata ayıklama desteği kişisel çalışma sürecinizi daha düzenli hâle getirebilir.
Son kontrol: Public sınıf adı dosya adıyla aynı mı, harflerin büyük-küçük yazımı eşleşiyor mu, dosyada tek bir top-level public sınıf mı var, eski .class dosyaları temizlendi mi ve komutlar doğru klasörde mi çalıştırılıyor?
Aynı Dosyada Birden Fazla public Sınıf Varsa Ne Olur?
Java’da bir dosyada iki public top-level sınıf tanımlamak, dosya adı kuralının ihlal edilmesine yol açar. Örneğin aşağıdaki sınıflar aynı First.java dosyasına yazılırsa derleme hatası alırsınız:
public class First {
}
public class Second {
}
Bu dosyada iki ayrı public sınıf vardır; ancak Java kaynak dosyasının adı yalnızca First.java ile eşleşmektedir. Second sınıfı için de kendi adıyla eşleşen bir dosya gerekir. Bu nedenle her public sınıfın, sınıf adıyla aynı ada sahip ayrı bir dosyada bulunması gerekir.
Bu durumda iki temel çözüm vardır:
- Sınıfları ayrı dosyalara ayırmak:
FirstsınıfıFirst.java,Secondsınıfı iseSecond.javaiçinde yer alır. - Yardımcı sınıfı public olmaktan çıkarmak: Sınıflardan yalnızca ana sınıf
publicbırakılır, diğer sınıfın başındakipublickaldırılır.
İkinci seçenek, küçük konsol ödevlerinde sık kullanılan pratik bir çözümdür. Aşağıdaki örnekte yalnızca Main sınıfı public durumdadır. Greeter ise aynı dosyada bulunan yardımcı sınıftır:
public class Main {
public static void main(String[] args) {
Greeter greeter = new Greeter();
System.out.println(greeter.message());
}
}
class Greeter {
String message() {
return "Merhaba Java";
}
}
Dosyayı tam olarak Main.java adıyla kaydedip aynı klasörde şu komutları çalıştırın:
javac Main.java
java Main
Beklenen çıktı şöyledir:
Merhaba Java
package Satırı ile Klasör Yolu Uyuşmuyorsa Nasıl Kontrol Edilir?

Dosya adı doğru olsa bile package bildirimi ile klasör yapısı uyuşmuyorsa Java programı derleme veya çalıştırma aşamasında sorun çıkarabilir. Örneğin dosyanın başında şu satır bulunuyorsa:
package okul.proje;
Main.java dosyasının paket yapısını temsil eden klasörler altında bulunması beklenir. Kök klasör üzerinden doğru yapı şu şekildedir:
proje-koku/
└── okul/
└── proje/
└── Main.java
Burada okul.proje ifadesindeki nokta, klasör yolunda ayırıcı görevi görür: okul/proje. package satırı da dosyanın baş tarafında, sınıf tanımından önce yer almalıdır.
Uyuşmazlık varsa iki farklı çözüm uygulanabilir:
- Dosyayı,
packagesatırına uygun klasörlere taşımak. packagesatırını dosyanın gerçekten bulunduğu klasör yapısına göre düzenlemek.
Bu iki çözümü birbirine karıştırmamak önemlidir. Dosyayı taşımadan yalnızca paket adını değiştirmek veya paket adını değiştirmeden dosyayı rastgele başka bir klasöre koymak sorunu çözmeyebilir. Önce kök klasörü belirleyin, ardından paket adındaki her parçanın karşılık geldiği klasörleri tek tek kontrol edin.
javac ve java Komutları Doğru Klasörde Nasıl Kullanılır?
Java dosyasını çalıştırırken iki farklı komut kullanılır: javac derler, java çalıştırır. Bu ayrımı bilmek, dosya adı ve sınıf adı doğru olduğu hâlde alınan komut hatalarını çözmeyi kolaylaştırır. Ayrıca komutlar, dosyanın bulunduğu klasöre veya package yapısına göre yazılmalıdır.
Package olmayan bir Java dosyasını derleme ve çalıştırma
Örneğin aşağıdaki dosyanın adı Main.java olsun:
public class Main {
public static void main(String[] args) {
System.out.println("Program çalıştı.");
}
}
Terminali Main.java dosyasının bulunduğu klasörde açarak şu komutları çalıştırabilirsiniz:
javac Main.java
java Main
javac Main.java komutu kaynak kodunu derler ve başarılı olursa Main.class dosyasını oluşturur. Derleme sırasında hata yoksa çoğu durumda terminalde ayrıca bir başarı mesajı görünmez. Ardından java Main komutu derlenmiş sınıfı çalıştırır ve ekrana şu çıktı gelir:
Program çalıştı.
Burada dikkat edilmesi gereken nokta, java komutunda .java uzantısının yazılmamasıdır. java Main.java ile java Main aynı kullanım değildir; temel derleme ve çalıştırma akışında önce javac, ardından uzantısız sınıf adı kullanılır.
Package kullanan bir dosyada doğru komutlar
Bu kez dosyanın içeriği şöyle olsun:
package okul.proje;
public class Main {
public static void main(String[] args) {
System.out.println("Package ile çalıştı.");
}
}
Bu dosya, proje kökünden başlayarak okul/proje/Main.java yolunda bulunmalıdır. Terminal de proje kökünde açılmalıdır. Komut akışı şöyledir:
javac okul/proje/Main.java
java okul.proje.Main
İkinci komutta klasör ayırıcıları kullanılmaz; package adı noktalarla yazılır ve sınıf adı sona eklenir. Bu nedenle java Main eksik, java okul.proje.Main.java ise yanlış biçimdir. Doğru tam sınıf adı okul.proje.Main şeklindedir.
Komut satırında zorlanıyorsanız, temel derleme ve dosya yapısı mantığını asenkron Java video eğitimleri içinde adım adım tekrar ederek pekiştirebilirsiniz.
| Durum | Derleme komutu | Çalıştırma komutu | Beklenen sonuç |
|---|---|---|---|
Package yok, terminal Main.java klasöründe |
javac Main.java |
java Main |
Main.class oluşur ve program çalışır |
package okul.proje; var, terminal proje kökünde |
javac okul/proje/Main.java |
java okul.proje.Main |
Package yapısına uygun sınıf çalışır |
| Java dosyası başka klasörde, terminal yanlış konumda | Dosya yolu bulunamaz veya hata oluşur | Sınıf bulunamayabilir | Önce çalışma klasörü düzeltilmelidir |
Beş Parçalı Java Hata Teşhis Sırası ve Son Kontrol Listesi
Public class ve dosya adı hatasını tek bakışta çözmek için aşağıdaki sırayı izleyin. Her adımda önce belirtiyi tanımlayın, sonra yalnızca gerekli kısmı düzeltin.
- Public sınıf adı ile dosya adını karşılaştırın.
Neye bakılır:
public class Mainsatırındaki sınıf adına ve dosyanın adına bakılır. Belirti: DosyaProgram.java, sınıf iseMainolarak tanımlanmıştır. Düzeltme: DosyayıMain.javaolarak yeniden adlandırın veya sınıf adını dosya adına uygun hâle getirin. - Birden fazla top-level public class olup olmadığını kontrol edin.
Neye bakılır: Dosyanın en dış seviyesinde kaç tane
public classbulunduğu incelenir. Belirti: Aynı dosyada iki public sınıf vardır. Düzeltme: Her public sınıfı kendi adıyla eşleşen ayrı bir.javadosyasına taşıyın. Public olmayan sınıflar aynı dosyada bulunabilir; ancak dosya adı yine public sınıf kuralına göre belirlenir. - Package satırını klasör yoluyla eşleştirin.
Neye bakılır:
package okul.proje;satırı ile klasörlerinokul/projebiçiminde olup olmadığı kontrol edilir. Belirti: Dosya farklı bir klasördedir veya package adı yazım olarak uyuşmaz. Düzeltme: Package satırını ya da klasör yapısını aynı hiyerarşiyi gösterecek şekilde düzeltin. - javac komutunda kaynak dosyasını ve çalışma klasörünü kontrol edin.
Neye bakılır: Derleme komutunun doğru klasörden çalıştırılıp çalıştırılmadığına bakılır. Belirti: “Dosya bulunamadı” veya kaynak dosyaya erişilemiyor benzeri bir hata görülür. Düzeltme: Terminali proje köküne ya da package olmayan dosyanın bulunduğu klasöre taşıyıp doğru
.javayolunu yazın. - java komutunda doğru tam sınıf adını kullanın.
Neye bakılır: Çalıştırma komutunda package adının ve sınıf adının birlikte yazılıp yazılmadığı kontrol edilir. Belirti: Derleme başarılı olduğu hâlde sınıf bulunamıyor veya çalıştırılamıyor. Düzeltme: Package varsa noktalarla tam sınıf adını yazın;
.javauzantısını eklemeyin.
Son kontrolü şu listeyle yapabilirsiniz:
- Dosya adının sonunda
.javauzantısı var mı? - Dosya adı ile public sınıf adı birebir aynı mı?
- Büyük-küçük harfler tamamen eşleşiyor mu?
- Dosyada yalnızca bir top-level public sınıf mı var?
packagesatırı klasör yolu ile uyumlu mu?javackomutu doğru kaynak dosyasını gösteriyor mu?- Derleme gerçekten hatasız tamamlandı mı?
javakomutunda uzantısız ve doğru sınıf adı mı kullanılıyor?- Eski veya yanlış klasördeki
.classdosyaları kafa karıştırıyor olabilir mi?
Java kavramlarını kısa sorularla tekrar etmek isteyenler, Java bilgi testi üzerinden dosya, sınıf ve temel sözdizimi bilgilerini kontrol edebilir.
Sık Sorulan Sorular
Java’da public class adı neden dosya adıyla aynı olmak zorundadır?
Java, public sınıfın hangi dosyada bulunduğunu dosya adına bakarak belirler. Bu nedenle public class Main tanımı bulunan dosyanın adı Main.java olmalıdır.
Dosya adında büyük-küçük harf farkı Java derleme hatasına neden olur mu?
Evet. Main.java ile main.java aynı kabul edilmeyebilir. Sınıf adı, dosya adı ve komutlarda kullanılan harfler aynı yazılmalıdır.
Aynı Java dosyasında birden fazla class bulunabilir mi?
Evet, aynı dosyada birden fazla sınıf tanımlanabilir. Ancak aynı dosyada birden fazla top-level public sınıf bulunamaz. Public sınıflar ayrı dosyalara ayrılmalıdır.
package satırı ile klasör yolu uyuşmuyorsa hangi dosya veya klasör değiştirilmelidir?
İki seçenek vardır: Package satırını mevcut klasör yapısına göre değiştirmek veya klasörleri package hiyerarşisine göre yeniden düzenlemek. Önemli olan iki tarafın birebir eşleşmesidir.
javac ile java komutları arasındaki fark nedir?
javac Java kaynak dosyasını derleyerek class dosyası oluşturur. java ise derlenmiş sınıfı çalıştırır; package varsa tam sınıf adı noktalarla yazılır ve .java uzantısı kullanılmaz.
Bu sırayı uyguladığınızda hata mesajını rastgele değişikliklerle değil, dosya adı, package yapısı, derleme ve çalıştırma adımlarını ayırarak çözebilirsiniz.