2013-04-12 322 views
1

我應該製作一個程序,不斷接受桌面訂單數據並顯示超過36英寸長且至少有一個抽屜的橡木桌子的所有相關信息。循環不會執行一次以上

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(未知來源) 在controlStruc.MangMaxB.main」

我該如何解決這個問題?

+0

爲什麼不只是處理'String'對象?沒有真正的要點將'char'從'String'中取出。無論如何,它看起來像它應該工作,你確定你問了一個字符嗎?如果您剛剛點擊輸入,那麼'String'的位置0處不會有'char'。 – 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); 

怎麼一回事,因爲input.nextLine()返回空字符串,因此當嘗試獲取第0個字符它返回StringIndexOutOfBoundsException 您需要在調用input.nextLine()之前得到一個字符串

+0

-1:新掃描器的分配是不必要的開銷,並避免了這裏問題的真正根源。 – berry120

0

你只是按下輸入?

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

當它是一個空字符串時會引發此錯誤。你的例外清楚地告訴你這一點。您需要檢查「nextLine」是否爲空字符串。

+0

也許檢查應該在那裏作爲好習慣,但這不是問題 - 問題是nextLine()將始終(在用戶輸入正確輸入的情況下)立即返回,因爲nextInt()調用不會不會導致掃描程序解析整數所在行的末尾。 – berry120

+0

是的,我按下輸入。我該如何解決?在我輸入客戶名稱後,它會生成錯誤 –

+0

啊,謝謝@ berry120 –

6

nextInt()不讀取行的末尾 - 只是下一個整數。如果您想閱讀該行的其餘部分,則需要在nextInt()之後致電nextLine()

目前,你並沒有這樣做,所以最後的nextLine()方法只是讀取整數後面的空行的其餘部分,並立即返回一個空字符串,導致異常。

在這種情況下,把一個nextLine()來電來訪應該做的伎倆:

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

如何添加input.nextLine();在input.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