2016-04-06 24 views
0

Bir Hangman oyunu yapıyorum ve kısa bir süre önce kelimeyi rastgele hale getirmek için bir dosya okuma yöntemi uygulamıştım; Ancak, okuyucuyu okuduğumdan önce hangi okuyucuyu okuyabildiğimi ve kodumun try catch bloğunu atladığını görmediğim için çok uzaklaşmadım. İşte bu yöntemi kullanan kurucusundan çizgidir:Try catch ifadelerini atlıyor musunuz?

word = determineWord(); 

Ve burada yöntemdir:

String determineWord() { 
    String fileName = "HangmanWords.txt"; 

    String line = null; 

    try { 
     FileReader fileReader = new FileReader(fileName); 

     BufferedReader bufferedReader = new BufferedReader(fileReader); 

     while((line = bufferedReader.readLine()) != null) { 
      line = bufferedReader.readLine(); 
     } 

     bufferedReader.close();   
    } 
    catch(FileNotFoundException ex) { 
     System.out.println("Can't open file");     
    } 
    catch(IOException ex) { 
     System.out.println("Error reading file");     
    } 
    return line; 
} 

hat başlangıçta boş olarak ayarlandığı için inanıyorum ben, NullPointerException olduğunu alma hatası, ve programımda kelime boş olamaz.

+4

Bu, try-catch bloğunu atlamaz. Ancak, her yinelemede iki satır okuyorsunuz ve satırın null olduğu zaman döngü durduğundan, satırın son değerini her zaman boş bırakıyorsunuz. Ne yapmaya çalıştığından emin değilim. –

+0

@JBNizet while döngüsü okunacak başka bir satır varsa denetler ve görür. Satır, dosyadaki son satır olarak dönmelidir. –

cevap

2

while döngüünüz yineleme başına 2 satır okur.

while((line = bufferedReader.readLine()) != null) { 
    line = bufferedReader.readLine(); 
} 

tekrar döngü gövdesinde) taleb (yok

String line = null; 
while((line = bufferedReader.readLine()) != null) { 
      // do something about the line 
} 
+0

i sonunda finalLine = satırını koyarak ve döndürerek bitirdim. Cevap için teşekkürler! –

+0

Yakalama İstisnası hiç de iyi bir sözleşme değildir. Aslında çok kötü bir uygulama. Yalnızca yapabileceğiniz ve ele almayı planladığınız istisnaları yakalamanız gerekir. –

+0

@JBNizet bunu değiştireceğim, teşekkürler! – haifzhan

1

while döngüünüz yanlış. Bu durumda, programınızın her seferinde line'u bıraktığı durum olan line == null.

Ayrı bir değişken oluşturmalı ve bunu dosyadan rasgele bir line yapmalısınız. Eğer metin dosyasına vardır kaç satır peşin bilmedikçe

private Random rnd = new Random(); 

String determineWord() { 
    String fileName = "HangmanWords.txt"; 

    String res = null; 

    try { 
     FileReader fileReader = new FileReader(fileName); 
     BufferedReader bufferedReader = new BufferedReader(fileReader); 
     String line = null; 
     int count = 1; 
     while((line = bufferedReader.readLine()) != null) { 
      if (res == null || 4*rnd.nextInt(count) > count) { 
       res = line; 
      } 
      count++; 
     } 

     bufferedReader.close();   
    } 
    catch(FileNotFoundException ex) { 
     System.out.println("Can't open file");     
    } 
    catch(IOException ex) { 
     System.out.println("Error reading file");     
    } 
    return res; 
} 

Şaşırtıcı süreç biraz karmaşıktır:

İşte tek tip olmadığı, bunu yapmak için basit bir yoludur. Bunu nasıl düzgün bir şekilde yapılacağı hakkında bilgi için bkz. reservoir sampling algorithm.

1

Dosyanın sonuna geldikten sonra iki kez okunuyorsunuz. Sadece bir kez okumadan veya okumadan önce bir kontrol yapabilirsiniz.

while(bufferedReader.readLine().hasNext()) { 
    line = bufferedReader.readLine(); 
} 
1

Kodunuz yanlıştır: bu sadece bir yerine her tekrarda iki satır okur ve her zaman boş satır, döner, Çünkü bu, döngünün durması için şart. Kod Ben de bir hata olduğunda, null adlı veya bazı rasgele çizgi dönen önleyeceğini şey

String lastReadLine = null; 
while((line = bufferedReader.readLine()) != null) { 
    lastReadLine = line; 
} 
return lastReadLine; 

gibi olmalıdır. Bir istisna varsa hiçbir şey olmamış gibi devam etmemelisiniz. Onu yakalamak yerine atın.

Okuyucunun kapalı olduğundan emin olmalısınız, ne olursa olsun. Kaynaklar-ile-try deyimi şu anlama gelir:

String determineWord() throws IOException { 
    String fileName = "HangmanWords.txt"; 

    try (FileReader fileReader = new FileReader(fileName); 
     BufferedReader bufferedReader = new BufferedReader(fileReader)) { 

     String line = null; 
     String lastReadLine = null; 
     while((line = bufferedReader.readLine()) != null) { 
      lastReadLine = line; 
     } 
     return lastReadLine; 
    } 
} 
İlgili konular