İçeriğe geç

Menü

Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Java "java.io.FileNotFoundException" Hatası Nasıl Çözülür?

java-io-filenotfoundexception-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. Java FileNotFoundException Hatası Neden Oluşur?
  2. Göreli Yol ve Çalışma Dizini Nasıl Kontrol Edilir?
  3. FileNotFoundException İçin Hangi Dosya Kontrolleri Yapılmalı?
  4. Düzeltilmiş Dosya Yoluyla Java Dosyası Nasıl Açılır?
  5. Sık Sorulan Sorular

Java java.io.FileNotFoundException hatası, programın verdiğin yol üzerinden dosyayı açamadığı veya dosyaya erişemediği durumlarda oluşur. Çözüm için önce dosya adını ve uzantısını, çalışma dizinini, üst klasörleri ve okuma ya da yazma erişimini kontrol etmelisin. Dosyanın gerçekten bulunmaması ile dosyaya erişilememesi, aynı istisna türüyle karşılaşılabilen farklı durumlardır.

Java FileNotFoundException Hatası Neden Oluşur?

Java FileNotFoundException Hatası Neden Oluşur?

İstisnanın adı dosyanın kesinlikle bulunmadığını düşündürebilir. Oysa Java, dosya yolunu açma işlemi başarısız olduğunda da bu istisnayı kullanabilir.

“FileNotFoundException yalnızca dosyanın yokluğunu değil, dosyaya erişilememesini de gösterebilir.”

Hatalı dosya adı veya uzantı: Kodda config.json yazarken diskteki dosyanın adı ayarlar.json ise yol doğru kabul edilmez. Yazım hataları, eksik uzantılar, dosya adındaki boşluklar ve dosya sisteminin büyük ya da küçük harfleri değerlendirme biçimi kontrol edilmelidir.

Yanlış göreli yol: data/rapor.txt gibi bir yol, dosyanın kaynak koduyla aynı klasörde aranacağını garanti etmez. Göreli yol, Java sürecinin çalışma dizinine göre çözümlenir. Bu nedenle dosya proje içinde görünür olsa bile program farklı bir çalışma dizininden başlatıldığında bulunamayabilir.

Dizin yolunun dosya gibi kullanılması: Dosya okuma veya yazma işlemi için verilen yol bir klasörü gösteriyorsa, dosya akışı oluşturulamayabilir. Dosyanın adı doğru olsa bile yolun son bileşeninin gerçekten açılabilir bir dosya olup olmadığını kontrol etmek gerekir.

Eksik üst klasör: Yazma işleminde hedef dosyanın üst klasörlerinden biri mevcut değilse Java dosyayı oluşturamaz. Bir dosyanın oluşturulabilmesi, eksik klasörlerin otomatik olarak oluşturulacağı anlamına gelmez.

Okuma veya yazma erişimi: Dosya mevcut olsa da programın içeriği okuma yetkisi olmayabilir. Benzer şekilde hedef klasörde yeni dosya oluşturma ya da mevcut dosyayı değiştirme yetkisi yoksa açma işlemi başarısız olabilir. Bu nedenle teşhis yalnızca dosyanın varlığını kontrol etmekten ibaret değildir.

Sonraki adımda dosya yolunun hangi çalışma dizinine göre çözümlendiğini görünür hâle getirerek bu olasılıkları birbirinden ayırabilirsin.

Göreli Yol ve Çalışma Dizini Nasıl Kontrol Edilir?

Göreli yol, çalıştırılan sürecin çalışma dizinine göre değerlendirilir. Kaynak dosyasının bulunduğu klasörün, proje kökünün veya önceden belirlenmiş başka bir klasörün otomatik olarak temel alınacağını varsayma. Programın nasıl başlatıldığına bağlı olarak aynı göreli yol farklı fiziksel konumlara karşılık gelebilir.

Mutlak yol dosya sistemindeki tam konumu belirtir. Göreli yol ise çalışma dizinine bağlı kısa bir tanımdır. Mutlak bir yol kullanmak belirsizliği azaltabilir, ancak yolun gerçekten mevcut ve erişilebilir olduğunu yine de doğrulamak gerekir.

Girilen yolu incelemek için bir Path nesnesi oluşturabilirsin: Path path = Path.of("data", "rapor.txt");. Ardından path.toAbsolutePath().normalize() ifadesi, göreli yolun hangi mutlak konuma karşılık geldiğini görmene yardımcı olur. toAbsolutePath() çalışma dizinini dikkate alır; normalize() ise . ve .. gibi gereksiz yol parçalarını sadeleştirir. Bu işlem tek başına dosyanın var olduğunu kanıtlamaz, yalnızca kontrol etmen gereken gerçek konumu görünür kılar.

Hatalı dosya adı durumunda kodda config.json yazarken gerçek dosyanın adı farklıdır. Yanlış göreli yolda dosya, örneğin data klasörünün içinde bulunduğu hâlde kodda doğrudan rapor.txt aranır. Farklı çalışma dizininde ise aynı data/rapor.txt ifadesi bir çalıştırmada doğru dosyaya, başka bir çalıştırmada olmayan bir konuma işaret edebilir.

Java dil temellerini ayrıca değerlendirmek için Java bilgi testini kullanabilirsin. Bu test dosya sistemindeki hatayı otomatik olarak teşhis etmez; Java konularındaki bilgi düzeyini yoklamaya yardımcı olur.

FileNotFoundException İçin Hangi Dosya Kontrolleri Yapılmalı?

FileNotFoundException İçin Hangi Dosya Kontrolleri Yapılmalı?

java.io.FileNotFoundException hatasını teşhis ederken dosya yolunu, dosyanın türünü ve erişim izinlerini ayrı ayrı kontrol et. Böylece hatalı dosya adı ile yanlış çalışma dizini gibi farklı sorunları birbirinden ayırabilirsin.

Neden Kontrol Olası çözüm
Hatalı dosya adı veya uzantı Files.exists(yol) ile dosyanın tam adı ve uzantısıyla bulunup bulunmadığını kontrol et. Dosya adını, uzantısını ve klasör adlarını doğru yaz. Gereksiz boşlukları da incele.
Yanlış göreli yol yol.toAbsolutePath().normalize() sonucunu yazdır. Eksik veya fazla klasör bölümünü düzelt ve çözümlenmiş yolu yeniden kontrol et.
Farklı çalışma dizini Paths.get("").toAbsolutePath().normalize() ile programın çalışma dizinini gör. Göreli yolu bu dizine göre düzenle veya teşhis amacıyla mutlak yolu kullan.
Bir dizinin dosya gibi açılması Files.isRegularFile(yol) sonucuna bak. Dosyayı gösteren gerçek yolu kullan. Yol bir klasörü gösteriyorsa dosya adını ekle.
Eksik üst klasör Hedefin üst klasörü için Files.exists() ve gerekirse Files.isDirectory() kullan. Eksik klasörü oluştur veya mevcut bir üst klasörü gösteren yol kullan.
Okuma izni sorunu Mevcut dosya için Files.isReadable(yol) sonucunu kontrol et. Dosyanın okunmasına izin verildiğini ve uygulamanın doğru kullanıcı bağlamında çalıştığını incele.
Yazma izni sorunu Mevcut hedefte Files.isWritable(yol), yeni hedefte ise üst klasörde aynı kontrolü yap. Yazma işlemi için uygun ve yazılabilir bir hedef klasör seç.

Henüz oluşturulmamış bir dosyanın kendisi için Files.exists() ve Files.isWritable() sonucu beklenen şekilde kullanılamayabilir. Bu durumda dosyanın mevcut üst klasörünü bulup bu klasörün varlığını, gerçekten dizin olup olmadığını ve yazılabilirliğini incelemelisin.

  1. Girilen dosya yolunu doğrudan yazdır.
  2. Programın çalışma dizinini belirle.
  3. toAbsolutePath().normalize() ile çözümlenmiş yolu görüntüle.
  4. Çözümlenmiş yol için Files.exists() kontrolü yap.
  5. Yolun normal bir dosyaya işaret edip etmediğini Files.isRegularFile() ile denetle.
  6. Okuma veya yazma işlemine göre Files.isReadable() ya da Files.isWritable() sonucunu incele.
  7. Kontrollerden sonra düzeltilmiş yolu kullanarak dosyayı açmayı dene.

Bu ön kontroller teşhis amacı taşır. Dosya açılana kadar dosyanın durumu veya erişim koşulları değişebileceği için try-catch yapısının ve kaynak yönetiminin yerini tutmaz.

Düzeltilmiş Dosya Yoluyla Java Dosyası Nasıl Açılır?

Aşağıdaki örnek, dosya yolunu komut satırı argümanı olarak alır. Önce yolu mutlak ve düzenlenmiş hâle getirir, ardından dosya açma işlemine geçmeden temel kontrolleri yazdırır.

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class DosyaAc {
    public static void main(String[] args) {
        if (args.length == 0) {
            System.out.println("Bir dosya yolu argümanı verin.");
            return;
        }

        Path girilenYol = Paths.get(args[0]);
        Path calismaDizini = Paths.get(System.getProperty("user.dir"))
                .toAbsolutePath()
                .normalize();
        Path duzeltilmisYol = girilenYol.toAbsolutePath().normalize();

        boolean varMi = Files.exists(duzeltilmisYol);
        boolean normalDosyaMi = Files.isRegularFile(duzeltilmisYol);
        boolean okunabilirMi = Files.isReadable(duzeltilmisYol);

        System.out.println("Çalışma dizini: " + calismaDizini);
        System.out.println("Kontrol edilen yol: " + duzeltilmisYol);
        System.out.println("Var mı: " + varMi);
        System.out.println("Normal dosya mı: " + normalDosyaMi);
        System.out.println("Okunabilir mi: " + okunabilirMi);

        if (!varMi || !normalDosyaMi || !okunabilirMi) {
            System.out.println("Dosya açılmadan önce kontroller başarısız.");
            return;
        }

        try (FileInputStream akis =
                     new FileInputStream(duzeltilmisYol.toFile())) {
            System.out.println("Dosya başarıyla açıldı.");
        } catch (FileNotFoundException e) {
            System.out.println("Dosya açılamadı: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("Dosya işlemi sırasında G/Ç hatası: "
                    + e.getMessage());
        }
    }
}

Ön kontroller olumlu olsa bile FileInputStream oluşturma işlemi try-with-resources içinde kalmalıdır. Yol yanlışsa veya dosyaya erişilemiyorsa kod, açma işlemine geçmeden kontrollü bir teşhis mesajı verir. Kontroller olumlu olduğu hâlde açma sırasında sorun oluşursa ilgili catch bloğu çalışır.

Çalışma dizini ve kontrol edilen yol satırlarındaki mutlak yollar, programın çalıştırıldığı makineye göre değişir. Başarılı bir örnekte sabit sonuçlar şöyledir:

Var mı: true
Normal dosya mı: true
Okunabilir mi: true
Dosya başarıyla açıldı.

Java öğrenme sürecinde birebir destek seçeneklerini incelemek için Java Özel Ders sayfasını inceleyebilirsin.

Sık Sorulan Sorular

Dosya mevcut olduğu hâlde java.io.FileNotFoundException neden oluşabilir?

Java, dosya yöneticisinde gördüğün dosyadan farklı bir yolu çözümlüyor olabilir. Yol bir dizini gösterebilir, dosyanın okuma izni olmayabilir veya dosya açma anına kadar taşınmış ya da silinmiş olabilir.

Göreli yol Java'da hangi çalışma dizinine göre çözülür?

Göreli yol, programın başlatıldığı çalışma dizinine göre çözülür. Bu dizin, kaynak kodunun veya proje dosyalarının bulunduğu klasörle aynı olmak zorunda değildir. Mutlak yolu yazdırarak kontrol edebilirsin.

Ön kontroller başarılı olsa bile try-catch neden korunmalıdır?

Dosya durumu ve erişim koşulları açma işlemine kadar değişebilir. Ayrıca dosyanın açılması veya kapatılması sırasında istisna oluşabileceği için try-with-resources ve catch blokları korunmalıdır.

Yeni bir dosyaya yazarken Files.isWritable() hangi yolu kontrol etmelidir?

Hedef dosya henüz yoksa Files.isWritable() doğrudan hedefte değil, hedefin mevcut üst klasöründe kullanılmalıdır. Hedef dosya zaten varsa dosyanın kendisi de kontrol edilebilir.

Dosya yolunu mutlak biçimde görüp dosya türünü ve erişim durumunu ayrı ayrı doğrulamak, FileNotFoundException teşhisini daha sistemli hâle getirir.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara