2013-04-12 2 views
1

Я должен сделать программу, которая постоянно принимает данные настольного заказа и отображает всю необходимую информацию для дубовых столов длиной более 36 дюймов и имеет по крайней мере один ящик.Loop не выполняется более одного раза

import java.util.*; 

public class MangMaxB 
{ 
    public static void main(String[] args) 
    { 
     Scanner input = new Scanner(System.in); 
     char ans; 
     int orderNum=0, length=0, width=0, numDrawer=0, price=1000; 
     String name; 

     System.out.print("Do you wish to enter Oak " + 
         "desk order data? (y/n)"); 
     ans = input.nextLine().charAt(0); 

     while (ans != 'n') 
     { 
      System.out.print("Enter customer name: "); 
      name=input.nextLine(); 

      System.out.print("Enter order number: "); 
      orderNum=input.nextInt();  

      System.out.print("Enter length and width of Oak desk" + 
         " separated by a space: "); 
      length = input.nextInt(); 
      width = input.nextInt(); 

      System.out.print("Enter number of drawer/s: "); 
      numDrawer=input.nextInt(); 

      if ((length>36)&&(numDrawer>=1)) 
      { 
       if ((length*width)>750) 
       { 
        price+= 250; 
       } 

       price+= (numDrawer*100); 
       price+= 300; 

       System.out.println("\nOak desk order information:\n" 
         + "Order number: " + orderNum + "\n" 
         + "Customer name: " + name + "\n" 
         + "Length: " + length + ", width: " 
         + width + ", surface: " + (length*width) 
         + "\n" + "Number of drawer/s: " + numDrawer 
         + "\nPrice of the desk is P " + price); 
      } 

      else 
      { 
       System.out.println("\nOak desk order isn't over 36 " + 
         "inches long and doesn't have a drawer"); 
      } 

      System.out.print("Any more items? (y/n) "); 
      ans = input.nextLine().charAt(0); 
     } 
    } 
} 

я смог ввести данные и отобразить его, но со второй попытки, поскольку она является цикл, это не сработало.

Он говорит: "Исключение в потоке "основной" java.lang.StringIndexOutOfBoundsException: индекс строки из диапазона: 0 в java.lang.String.charAt (Unknown Source) в controlStruc.MangMaxB.main"

как это исправить?

+0

Почему бы просто не иметь дело с объектами 'String'? Нет смысла указывать 'char' из' String'. В любом случае, мне кажется, что он должен работать, вы уверены, что ввели персонажа, когда он спросил? Если вы просто нажмете Введите там не будет 'char' в позиции 0 в' String'. – Quetzalcoatl

+0

ну, мне кажется, что 'input.nextLine()' - пустая строка в конце вашего цикла –

+0

@SamIam Это * почему * это пустая строка, хотя это реальный вопрос здесь! – berry120

ответ

0

Пожалуйста, используйте как ниже,

System.out.print("Any more items? (y/n) "); 
input = new Scanner(System.in); 
ans = input.nextLine().charAt(0); 

beacuse input.nextLine() возвращает пустую строку, так что, когда попытайтесь получить 0-й символ, который возвращает StringIndexOutOfBoundsException Вам нужно получить строку перед вызовом input.nextLine()

+0

-1: Распределение нового сканера является ненужным накладным расходами и позволяет избежать реального источника проблемы. – berry120

0

Вы только нажимаете enter?

ans = input.nextLine().charAt(0); 

вызывает эту ошибку, когда это пустая строка. Ваше исключение ясно говорит вам об этом. Вам нужно проверить, является ли «следующая строка» пустой строкой или нет.

+0

Возможно, проверка должна быть хорошей практикой, но это не проблема - проблема в том, что nextLine() всегда (в сценарии, когда пользователь вводит правильный ввод) немедленно возвращается, так как вызов nextInt() doesn Не заставляйте сканер разбирать конец строки, в которой находится целое число. – berry120

+0

Да, я нажимаю enter. Как это исправить? После ввода имени клиента он генерирует ошибки –

+0

ahh, благодаря @ berry120 –

6

nextInt() не читает конец строки - просто следующее целое число. Вам нужно позвонить nextLine() после nextInt(), если вы хотите прочитать оставшуюся часть этой строки.

В настоящее время вы этого не делаете, поэтому последний метод nextLine() просто читает остальную часть пустой строки после целого числа и возвращает сразу с пустой строкой, вызывая исключение.

В этом случае, поставив nextLine() вызов здесь следует сделать трюк:

System.out.print("Enter number of drawer/s: "); 
numDrawer=input.nextInt(); 
input.nextLine(); //Added nextLine() call 
+0

я добавляю input.nextLine(); во всей строке после ввода.nextInt(); ?? –

+0

@DohaKik В этом примере я считаю, что нужно только добавить его в указанную мной строку. – berry120

0

Очевидно, согласно d ocumentaion:

nextLine() - Advances this scanner past the current line and returns the input that was skipped. This method returns the rest of the current line, excluding any line separator at the end. The position is set to the beginning of the next line.

nextInt() - Scans the next token of the input as an int.

И отныне ans = input.nextLine() в код возвращает вас '' и char(0) лидировал StringIndexOutOfBoundsException.

+0

Предполагаю, что вторая ссылка на nextLine() на самом деле означает nextInt()? – berry120

+0

@ berry120 Спасибо, я отредактировал то же самое. – abc

Смежные вопросы