2017-12-02 119 views
0

所以我有這段代碼,我需要它打開一個文件,並掃描文件中的兩個整數,然後我需要它來存儲這兩個數字。第一個數字的數字限制在1到10之間,第二個數字的數字限制在1到39之間。我有一個valueCounter來確保正確的數字存儲在正確的變量中。由於某些原因,代碼總是返回 「您的初始Fib超出範圍,在1-10之間的進球號」 如果第一個數字大於10或小於1,這將是適當的,但無論我如何更改第一個數字,代碼返回相同的行。唯一不會返回該行的是當我將第二個數字更改爲1到10之間。所以我可以得出結論,代碼跳過第一個數字,但我無法弄清楚爲什麼。任何智力更高的人都可以提供幫助?從文件讀取不會讀取第一個值Java

private static File inFile = null; 
private static PrintWriter outFile = null; 
private static int startValue; 
private static int lengthValue; 

public static void main(String[] args) throws IOException 
{ 

    inFile = new File(inFileName); 
    Scanner in = new Scanner (inFile); 
    outFile = new PrintWriter (outFileName); 
    int valueCounter = 1; 
    while (in.hasNextInt()) 
    { 
     int value = in.nextInt(); 
     if (value <= 39 && value >= 1 && valueCounter == 2) 
     { 
      lengthValue = value; 
      valueCounter ++; 
     } 
     if (value > 39 || value < 1 && valueCounter == 2) 
     { 
      System.out.println("You are asking for too many Fib, eneter # between 1-39"); 
      in.close(); 
      System.exit(1); 
     } 
     if (value <= 10 && value >= 1 && valueCounter == 1) 
     { 
      startValue = value; 
      valueCounter ++; 
     } 
     if (value > 10 || value < 1 && valueCounter == 1) 
     { 
      System.out.println("Your Initial Fib is out of range, eneter # between 1-10"); 
      in.close(); 
      System.exit(1); 
     } 
    } 
} 
+0

你是否嘗試了逐行調試來查看實際數字是什麼?或者只是爲了這件事打印出來 –

+0

@RichardTingle是的,爲了簡單起見,我確定排除我知道的代碼不是問題,我一直在逐行調試大概一個小時,試圖弄清楚這一點。 –

+0

這似乎是一個可怕的地方使用循環,**爲什麼**你使用循環? –

回答

1

正是因爲operator precedence,該&&||之前評估。這使得下面的表達式

if (value > 10 || value < 1 && valueCounter == 1) 

評價爲真正的第二輪中,因爲第一value < 1 && valuecounter == 1進行評價,這是錯誤的。接下來,value > 10被評估,這是真的。 Or - 兩個結果都是正確的,並且正文執行。使用括號來控制評估順序。

+0

是的,這是做到了,謝謝! –

+0

很高興能幫到你! – Koekje

0

if (value > 10 || value < 1 && valueCounter == 1) 似乎永遠是真實的,因爲它是一個正常的外部「如果」在代碼的末尾,它總是被稱爲。過時你的「如果」和它的外觀