2011-01-27 3 views
1
boolean z = false; 
do { 
    try { 
     a = sc.nextInt(); 
     z = true; 
    } 
    catch(Exception e) { 
    } 
} 
while(!z); 

Попробуйте это. Если вы попробуете целое число при первом правильном выполнении. Однако, если вы вводите неправильный тип текста, он превращается в бесконечный цикл, даже если вы вводите int next и пропускаете присвоение логическому значению true. Почему это?Бесконечный цикл при использовании сканера?

+7

Этот код мало смысла. Объявлено не объявлено, и в цикле он не изменяется. Возможно, вы скопировали это неправильно? Для таких проблем всегда лучше размещать небольшую автономную компилируемую программу как можно больше. –

+2

Предполагается, что эта строка должна находиться (z == false); ??? – CoolBeans

+0

Я предполагаю, что да, но даже это плохая форма. Лучше будет while (! Z); –

ответ

8

Ваша проблема в том, что вы не обрабатываете токен конца строки, и поэтому сканер остается висящим. Вы хотите сделать что-то вроде этого:

import java.util.Scanner; 

public class Foo2 { 
    public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 
     int a = 0; 
     boolean catcher = false; 
     do { 
      try { 
       System.out.print("Enter a number: "); 
       a = sc.nextInt(); 
       catcher = true; 
      } catch (Exception e) { 
      } finally { 
       sc.nextLine(); 
      } 

     } 
     // !!while(catcher == false); 
     while (!catcher); 

     System.out.println("a is: " + a); 
    } 
} 

Кроме того, while (z == false) является плохим. Вам намного лучше с (! Z). Это предотвращает ошибку while (z = false), и это более чистый способ выразить это.

редактировать для Марсело:

Марсело, спасибо за ваш вклад и советы! Вы говорите, что условие в блоке if ниже не изменит значение булева, спама?

boolean spam = true; 

    if (spam = false) { 
    System.out.println("spam = false"); 
    } 

    System.out.printf("spam = %b%n", spam); 

Потому что, если это изменить, кодер не ожидал, если они предназначены для записи, если (спам == ложь), то может быть тонкие и опасные побочные эффекты от этого. Опять же, спасибо за помощь в разъяснении этого для меня!

+0

Спасибо. Наконец, он отлично работал. Это сказало, что я думал, что z и z == false были одинаковыми? –

+0

Они, но большинство считают, что! Z чище. И снова вы не сталкиваетесь с пагубной if (z = false) ошибкой, где условие if фактически устанавливает логическое значение. –

+1

Ошибка присваивания не будет выполняться в Java, потому что присваивания не оценивают какое-либо значение (они не являются допустимыми выражениями. Это проблема с C, C++ и других языков. – Marcelo