Java “should be declared in a file named” hatası, public sınıfın adı ile dosyanın .java uzantısı dışındaki adının eşleşmemesi nedeniyle oluşur. Çözüm için dosya adını sınıf adına göre değiştirebilir, sınıf adını dosyaya göre düzenleyebilir veya sınıfı public olmaktan çıkarabilirsin.
Hatanın kaynağını görmek için dosyanın içeriğini, komutu ve derleyicinin bildirdiği satırı birlikte incelemek gerekir.
Bu Java derleme hatası ne anlama gelir?
Public üst düzey sınıfın temel adı ile .java dosyasının temel adı eşleşmediğinde bu derleme hatası oluşur. Derleme hatası, kaynak kod derleyici tarafından çalıştırılabilir sınıf çıktısına dönüştürülmeden önce bildirilen ve programın derlenmesini engelleyen hatadır.
Örneğin dosyanın adı Ogrenci.java olsun, ancak dosyanın içinde Main adlı bir public sınıf bulunsun:
public class Main {
public static void main(String[] args) {
System.out.println("Merhaba");
}
}
Bu dosya Ogrenci.java adıyla kaydedilip javac Ogrenci.java komutu çalıştırıldığında derleyici, sınıfın Main.java adlı dosyada bulunması gerektiğini bildirir:
Ogrenci.java:1: error: class Main is public, should be declared in a file named Main.java
public class Main {
^
1 error
Burada hata, main metodunun yazımından veya System.out.println satırından kaynaklanmaz. Derleyici, dosyanın adını Ogrenci, public sınıfın adını ise Main olarak görür. Bu iki temel ad farklı olduğu için kaynak kodu derlemeyi durdurur.
Dosya adı ile public sınıf adı neden eşleşmeli?

Üst düzey sınıf, başka bir sınıfın, metodun veya kod bloğunun içinde tanımlanmayan sınıftır. Java, public üst düzey sınıfın kolayca bulunabilmesi için bu sınıfın adını dosyanın temel adıyla eşleştirir.
Bu nedenle public class Ogrenci bildirimi Ogrenci.java dosyasında bulunmalıdır. Dosya adındaki .java uzantısı eşleşmeye dâhil edilmez. Bir kaynak dosyada class, interface veya benzeri üst düzey türlerden en fazla biri public olabilir ve public türün adı dosya adıyla uyumlu olmalıdır.
Büyük ve küçük harfler de adın bir parçasıdır. Örneğin Merhaba.java dosyasında public class merhaba yazılması doğru eşleşme oluşturmaz. Merhaba ve merhaba Java açısından aynı ad değildir.
Aynı dosyada public olmayan üst düzey sınıflar bulunabilir. Örneğin Merhaba.java içinde bir public Merhaba sınıfı ve public olmayan bir Yardimci sınıfı tanımlanabilir. Dosya adı kuralı, özellikle public sınıfın adı için geçerlidir.
Bu ayrımı class bildirimi, erişim belirleyicileri ve derleme süreciyle birlikte pekiştirmek için Java bilgi testini çözerek temel kavramlarını kontrol edebilirsin.
Ogrenci.java örneği üç farklı nasıl düzeltilir?
Ogrenci.java dosyasında public class Main bulunuyorsa dosya adı ile public sınıf adı eşleşmez. Java derleyicisi, public üst düzey sınıfın kendi adıyla aynı ada sahip bir .java dosyasında bulunmasını bekler.
1. Dosya adını Main.java yapmak
İlk yöntemde sınıf kodu korunur ve dosyanın adı Main.java olarak değiştirilir.
public class Main {
public static void main(String[] args) {
System.out.println("Program calisti");
}
}
Dosyayı Main.java adıyla kaydettikten sonra aynı klasörde şu komutları çalıştır:
javac Main.java
java Main
Programın çıktısı Program calisti olur.
2. Sınıf adını Ogrenci yapmak
Dosya adını korumak istersen public sınıfın adını Ogrenci yapabilirsin. Bu durumda çalıştırılacak sınıfın adı da Ogrenci olur.
public class Ogrenci {
public static void main(String[] args) {
System.out.println("Ogrenci programi");
}
}
Dosya yine Ogrenci.java olarak kalır. Derleme ve çalıştırma komutları şöyledir:
javac Ogrenci.java
java Ogrenci
Beklenen çıktı Ogrenci programi satırıdır.
3. public ifadesini kaldırmak
Bu örnekte sınıf public olmaktan çıkarılarak paket erişimli hâle getirilir. Dosya adı Ogrenci.java olarak kalabilir, ancak programı başlatmak için sınıf adı yine Main yazılır.
class Main {
public static void main(String[] args) {
System.out.println("Main calisti");
}
}
javac Ogrenci.java
java Main
Bu komutlardan sonra Main calisti çıktısı alınır. Paket erişimli sınıf, aynı paket içindeki kodlar tarafından kullanılabilir; başka bir paketten doğrudan erişim gerektiğinde public görünürlük tercih edilmelidir.
Aynı dosyada iki public sınıf neden derlenmez?

Bir dosyada iki public üst düzey sınıf bulunduğunda her iki sınıf da kendi adıyla eşleşen dosyayı gerektirir. Bu nedenle aşağıdaki Ogrenci.java dosyasında Main sınıfı için dosya adı uyuşmazlığı oluşur. Public sınıfların dosya adıyla eşleştirilmesi ve üst düzey sınıfların paket erişimi Java’nın kaynak dosyası düzeninin temel kuralları arasındadır.
// Ogrenci.java
public class Ogrenci {
}
public class Main {
public static void main(String[] args) {
System.out.println("Basladi");
}
}
Geçerli çözüm, sınıfları iki dosyaya ayırmaktır:
// Ogrenci.java
public class Ogrenci {
}
// Main.java
public class Main {
public static void main(String[] args) {
Ogrenci ogrenci = new Ogrenci();
System.out.println("Iki sinif hazir");
}
}
İki dosyayı aynı klasörde tutup javac Ogrenci.java Main.java komutunu çalıştırabilirsin. Ardından java Main komutu Iki sinif hazir çıktısını verir. Tasarım uygunsa sınıflardan birinin public ifadesi kaldırılarak iki sınıf aynı dosyada da tutulabilir. Bu durumda public sınıfın adı dosya adını belirler ve diğer sınıf aynı paket içinde erişilebilir olur.
Büyük küçük harf ve IDE yeniden adlandırma nasıl yapılır?
Java’da sınıf adları büyük küçük harfe duyarlıdır. Bu nedenle Merhaba.java dosyasında public class merhaba yazılması, dosya adı ile sınıf adının aynı kabul edilmemesine yol açar. Doğru eşleşmede dosya adı Merhaba.java, bildirim ise public class Merhaba şeklindedir.
public class Merhaba {
public static void main(String[] args) {
System.out.println("Merhaba");
}
}
Bu kodun bulunduğu dosya Merhaba.java olarak kaydedilmelidir. Dosya adında veya sınıf bildiriminde yalnızca bir harfin bile farklı büyüklükte yazılması eşleşmeyi bozar.
Sık yapılan üç hata şunlardır:
- Dosya işletim sisteminde yeniden adlandırılır, fakat IDE içindeki sınıf adı eski biçimiyle bırakılır.
- Dosya adındaki bir harfin büyüklüğü değiştirilir, fakat
public classbildirimi güncellenmez. - Aynı dosyaya birden fazla üst düzey
publicsınıf eklenir.
IDE içinde güvenli bir yeniden adlandırma yapmak için şu sırayı izleyebilirsin:
- Dosya veya sınıf adının üzerine sağ tıkla ve Rename ya da Refactor seçeneğini aç.
- Yeni adı, Java sınıf adlandırma biçimine uygun olarak yaz. Örneğin
merhabayerineMerhabakullan. - IDE’nin dosya adını ve kaynak kodundaki sınıf bildirimini birlikte güncellediğini kontrol et.
- Dosya gezgininde gerçek dosya adını, kod içinde ise
public classsonrasındaki adı karşılaştır.
Kendi dosyanı teşhis ederken dosya adını .java uzantısıyla birlikte kontrol et. Ardından public class bildirimindeki adın dosya adıyla tamamen aynı olduğuna, büyük küçük harflerin eşleştiğine ve aynı dosyada yalnızca bir üst düzey public sınıf bulunduğuna bak. Java derleyicisi kaynak dosyalarını ve sınıfları adları üzerinden düzenlediği için bu dört kontrol, hatanın kaynağını daraltmaya yardımcı olur.
Düzeltmeden sonra Java programı nasıl kontrol edilir?
Düzeltmeden sonra önce kaynak dosyasını javac Dosya.java komutuyla derle, ardından oluşan sınıfı java SınıfAdı komutuyla çalıştır. İkinci komutta dosya adını değil, public class bildirimindeki sınıf adını kullanmalısın.
javac Merhaba.java
java Merhaba
Derleme başarılıysa programın çıktısı terminalde görünür. Kontrol sırasında dosyanın uzantısının gerçekten .java olduğuna, sınıf bildiriminin dosya adıyla aynı yazıldığına, büyük küçük harflerin eşleştiğine ve dosyada birden fazla üst düzey public sınıf bulunmadığına bak. javac kaynak dosyasını derleyerek sınıf dosyaları oluşturur ve dosya adlarının içerdiği türlerle uyumlu olmasını bekler.
java Dosya.java komutu ise farklı bir çalışma biçimi kullanır. Java başlatıcısı, .java uzantılı dosyayı kaynak dosyası olarak derleyip çalıştırır. Bu yöntemde dosyadaki ilk üst düzey sınıf çalıştırılır ve kaynak dosyası için tür adının dosya adıyla eşleşmesini zorunlu kılan isteğe bağlı kural uygulanmaz. Bu nedenle standart javac Dosya.java akışıyla kaynak dosyası çalıştırma biçimini birbirine karıştırmamak gerekir.
Sık Sorulan Sorular
Java’da public sınıf adı ile dosya adı neden aynı olmalıdır?
public sınıf, başka paketlerden de erişilebilen üst düzey bir türdür. Java’nın kaynak dosyası düzeni, bu türün adını dosya adıyla ilişkilendirerek derleyicinin sınıfı bulmasını kolaylaştırır.
Java dosyasında public olmayan bir sınıf farklı dosya adıyla bulunabilir mi?
Evet, public olmayan üst düzey bir sınıf farklı adlı bir dosyada bulunabilir. Yine de dosyaları sınıf adlarıyla eşleştirmek, proje düzenini ve sınıfların bulunmasını kolaylaştırır.
Merhaba.java ile public class merhaba arasındaki büyük küçük harf farkı neden hata oluşturur?
Java sınıf adlarını büyük küçük harfe duyarlı değerlendirir. Merhaba ve merhaba farklı adlar olduğu için bu iki ifade aynı sınıfı göstermez.
IDE’de Java dosyası ve sınıf adı refactor kullanılarak nasıl yeniden adlandırılır?
Dosya veya sınıf üzerinde Rename ya da Refactor seçeneğini kullanarak yeni adı girmen gerekir. İşlemden sonra dosya adını ve public class bildirimini birlikte kontrol etmelisin.
java Dosya.java komutu kullanıldığında dosya adı ve public sınıf kuralı değişir mi?
Bu komut kaynak dosyası çalıştırma biçimini kullanır ve dosya adı kuralını standart derleme akışından farklı ele alır. Ancak düzenli projelerde dosya adı ile public sınıf adını eşleştirmek doğru ve sürdürülebilir yaklaşımdır.
Hata düzeltildikten sonra dosya adını, sınıf bildirimini ve çalıştırma komutundaki sınıf adını aynı adlandırma düzeni içinde kontrol etmek, Java derleme sürecini daha anlaşılır hâle getirir.