2011-10-28 80 views
-3
import java.util.Scanner; 

public class Power1Eng { 

public static void main(String[] args) { 

    double x, prod = 1; 
    int n; 
    String s; 

    Scanner input = new Scanner(System.in); 

    System.out.print("This program prints x(x is a real number) raised to the power of n(n is an integer).\n"); 

    outer_loop: 
    while (true) { 
     System.out.print("Input x and n: "); 
     x = input.nextDouble(); 
     n = input.nextInt(); 

     for (int i = 1; i <= n; i++) { 
      prod *= x; 
     } 

     System.out.printf("%.1f raised to the power of %d is %.4f. Do you want to continue?(Y/N) ", x, n, prod); 
     s = input.nextLine(); 

     if (s.charAt(0) == 'Y') 
      continue; 
     else if (s.charAt(0) == 'N') 
      break; 
     else { 
      inner_loop: 
      while (true) { 
       System.out.print("Wrong input. Do you want to continue?(Y/N) "); 
       s = input.nextLine(); 

       if (s.charAt(0) == 'Y') 
        continue outer_loop; 
       else if (s.charAt(0) == 'N') 
        break outer_loop; 
       else 
        continue inner_loop; 
      } 
     } 
    }  
} 

} 

enter image description here「在線程異常」多

當我用剛剛next()方法上只有微不足道的邏輯錯誤,但是當我改變 next()方法nextLine()方法,這個錯誤顯示。

我該如何解決這個問題?

回答

3

有兩個問題。首先是你的字符串可能是空的,然後提取第一個字符會給出一個異常。

if (s.charAt(0) == 'Y') // This will throw if is empty. 

這兩項測試中字符串的長度,看是否有至少一個字符,或者只是使用String.startsWith代替charAt

if (s.startsWith('Y')) 

的第二個問題是,你以後進入了一個新的生產線你的第一個輸入,nextLine只能讀取下一個新行字符。

0

您可以檢查一個初始字符數,以確保您所期望的字符數是正確的。即:

while (true) 
{ 
    // ... some code ... 

    if (s.length() < 1) 
    { 
     continue; 
    } 

    // ... some code ... 
} 

這樣,你甚至不必繼續運行的代碼,如果代碼庫是較大的,將有助於優化性能的其餘部分。

0

您在控制檯中看到的「紅色文本」表示文本被髮送到標準錯誤。在這種情況下,這表示您的程序崩潰了。

您所遇到的主要問題是這種邏輯:

System.out.print("Input x and n: "); 
x = input.nextDouble(); 
n = input.nextInt(); 

for (int i = 1; i <= n; i++) { 
    prod *= x; 
} 

System.out.printf("%.1f raised to the power of %d is %.4f. Do you want to continue?(Y/N) ", x, n, prod); 
s = input.nextLine(); 

假設用戶輸入是:

2.1 4(輸入)

input.nextDouble()將採取2.1,在標準輸入流上留下4(enter)
input.nextInt()將採取4,在標準輸入流上留下(enter)
input.nextLine()將花費""(空字符串),最後從xn的初始用戶輸入中清除(enter)