2013-03-15 23 views
7

Java atamamla ilgili bir sorun yaşıyorum.Tarayıcı NoSuchElementException

java.util.NoSuchElementException: Ben özellikle, beklenmedik bir durum alıyorum Hiçbir çizgi ben Scanner(System.in) kullanıyorum

bulundu ve program sürekli hiçbir şey okuyup "geçersiz biçim" istisna tekrar ediyor Metin. Doğru değerli bir int girerseniz, ilk kısım geçer ve double bölümü hemen bu özel duruma girer. Yanlış değerlenmiş bir int girerseniz, istisnayı döngülemeye başlar. Eğer bir istisna yakalandı bütün üç yerde aynı iletiyi yazdırmak yana

import java.util.Scanner; 

public class Program_4 { 

    public static void main(String[] args) { 
     getValidInt("Enter an integer from 5 to 50",5,50); 
     getValidDouble("Enter a double from 5.0 to 50.0",5.0,50.0); 
     getValidString("Enter a string with length from 5 to 8 characters",5,8); 
    } 


    public static int getInt(String prompt) 
    { 
     Scanner sc = new Scanner(System.in); 
     int i = 0; 
     boolean isValid; 
     do 
     { 
      try 
      { 
      System.out.print(prompt + ": "); 
      i = Integer.parseInt(sc.nextLine()); 
      isValid = true; 
      } 
      catch (Exception e) 
      { 
       System.out.println(e); 
       System.out.print("Invalid Format: "); 
       isValid = false; 
      } 
     } 
     while (isValid == false); 
     sc.close(); 
     return i; 
    } 

    public static int getValidInt(String prompt, int min, int max) 
    { 
     int i = 0; 
     boolean isValid = false; 
     do 
     { 
      i = getInt(prompt); 
      if(i < min) System.out.println("Value must be >= " + min); 
      else if(i > max) System.out.println("Value must be <= " + max); 
      else isValid = true; 
     } while (isValid == false); 

     return i; 
    } 

    public static double getDouble(String prompt) 
    { 
     Scanner sc = new Scanner(System.in); 
     double i = 0.0; 
     boolean isValid; 
     do 
     { 
      try 
      { 
      System.out.print(prompt + ": "); 
      i = Double.parseDouble(sc.nextLine()); 
      isValid = true; 
      } 
      catch (Exception e) 
      { 
       System.out.println(e); 
       System.out.println("Invalid Format: "); 
       isValid = false; 
      } 
     } while (isValid == false); 
     sc.close(); 
     return i; 
    } 

    public static double getValidDouble(String prompt, double min, double max) 
    { 
     int i = 0; 
     boolean isValid = false; 
     do 
     { 
      i = getInt(prompt); 
      if(i < min) System.out.println("Value must be >= " + min); 
      else if(i > max) System.out.println("Value must be <= " + max); 
      else isValid = true; 
     } while (isValid == false); 

     return i; 
    } 

    public static String getString(String prompt) 
    { 
     Scanner sc = new Scanner(System.in); 
     String i=""; 
     boolean isValid; 
     do 
     { 
      try 
      { 
      System.out.print(prompt + ": "); 
      i = sc.nextLine(); 
      isValid = true; 
      } 
      catch (Exception e) 
      { 
       System.out.print("Invalid Format: "); 
       isValid = false; 
      } 
     } while (isValid == false); 
     sc.close(); 
     return i; 
    } 

    public static String getValidString(String prompt, int min, int max) 
    { 
     String i; 
     boolean isValid = false; 

     do 
     { 
      i = getString(prompt); 
      if(i.length() < min) System.out.println("String must be more than "  + min + " characters."); 
      else if(i.length() > max) System.out.println("String must be more  than " + max + " characters."); 
      else isValid = true; 
     } while (isValid == false); 

     return i; 
    } 
} 

cevap

14

Sen yatan InputStream kapatır Kapatmak birden fazla Scanner, bu nedenle başka Scanner artık aynı InputStream ve NoSuchElementException sonuçlarından okuyabilirsiniz var.

Konsol uygulamaları için, System.in'dan okumak için tek bir Scanner kullanın.

+0

Yardımın için teşekkürler, tutulma tarayıcıyı kapatmama konusunda bana bir uyarı veriyordu ve aksi takdirde bunu eklemezdim. – user2175782

2

, ne olup bittiğini kesin olarak söylemek zor: İşte

benim kodudur

    istisna böyle Exception yakalamak etmeyin
  • oluyor nereye
  • Kullanım printStackTrace() öğrenmek için. Beklediğiniz istisnaları yakalayın ve kodunuzun işlenmesi için tasarlandı. Eğer Exception'u yakalarsanız, beklenmedik istisnalar (NPE, dosya sonu, vb) ve yanlış bunları "Geçersiz biçim" olarak bildirerek her türlü yakalamaya son verebilirsiniz.

+1

+1. Ayrıca, getValidDouble'da (String komut istemi, double min, double max) '' int '= 0' 'seçeneğiniz var, ben 'int' olmasını istediğinize emin misiniz? – Adeeb

+0

Bunu görmedim, teşekkürler Adeeb. – user2175782

+0

Lütfen aşağılamayı açıklayın. Sorunun orijinal versiyonunun istisnanın ne olduğunu söylemediğini unutmayın. –