Pertanyaan kesalahan saat menggunakan coba dengan sumber daya di Jawa


Saya memiliki metode ini di mana saya menggunakan coba dengan sumber daya Java SE 7.

private void generateSecretWord(String filename){

        try (FileReader files = new FileReader(filename)){
            Scanner input = new Scanner(files);
            String line = input.nextLine();
            String[] words = line.split(",");
            Collections.shuffle(Arrays.asList(words));
            if (words[0].length()>1){
                secretWord = words[0];
                return;
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        finally {
            if (files!=null) files.close(); 
        }

    }

Saya mendapatkan kesalahan kompilasi finally halangi itu files cannot be resolved to a variable Saya punya referensi untuk file di try with block. mengapa saya mendapatkan kesalahan ini dan bagaimana cara memperbaikinya?

Terima kasih


5
2017-11-22 20:54


asal


Jawaban:


Diambil dari Spesifikasi Bahasa Java (14.20.3):

Pernyataan coba-dengan-sumber daya diparameterkan dengan variabel (dikenal sebagai sumber daya) yang diinisialisasi sebelum pelaksanaan blok coba dan ditutup secara otomatis, dalam urutan terbalik dari mana mereka diinisialisasi, setelah pelaksanaan blok coba. menangkap klausa dan a akhirnya klausa sering tidak diperlukan ketika sumber daya ditutup secara otomatis.

ResourceSpecification menyatakan satu atau lebih variabel lokal dengan ekspresi penginisialisasi untuk bertindak sebagai sumber daya untuk pernyataan coba.

Jadi Anda tidak perlu menutup Sumber Daya lagi. Coba-dengan-sumber daya melakukannya secara otomatis untuk Anda dan Anda FileReader hanya akan tersedia di try blok. Dengan demikian Anda mendapatkan kesalahan kompilasi.


5
2017-11-22 20:55



Ketika Anda menggunakan coba dengan sumber daya Anda tidak perlu secara eksplisit menutupnya. coba-dengan-sumber daya akan mengurus menutup sumber daya tersebut.

Berdasarkan coba-dengan-sumber daya dokumen

Pernyataan try-with-resources adalah pernyataan coba yang menyatakan satu atau lebih sumber daya. Sumber daya adalah objek yang harus ditutup setelah program selesai dengan itu. Pernyataan coba-dengan-sumber daya memastikan bahwa setiap sumber daya ditutup pada akhir pernyataan.


10
2017-11-22 20:55



Karena tidak ada orang lain yang menyebutkan ini, jika Anda ingin menanganinya secara manual Anda dapat melakukan sesuatu seperti:

private void generateSecretWord(String filename){
        FileReader files = null;
        try {
            files = new FileReader(filename);
            Scanner input = new Scanner(files);
            String line = input.nextLine();
            String[] words = line.split(",");
            Collections.shuffle(Arrays.asList(words));
            if (words[0].length()>1){
                secretWord = words[0];
                return;
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        finally {
            if (files!=null) 
                files.close(); 
        }

    }

2
2017-11-22 21:05



Kode yang Anda coba jalankan adalah kode kuno sebelum Java 7 di mana harus menutup sumber daya untuk menghindari kebocoran memori. Tetapi di New Java 7, ambillah dengan cerdas dan tidak perlu menutup sumber daya meskipun tidak dapat diakses untuk akhirnya memblokir.


0
2017-08-24 05:05