2017-03-15 29 views
-1

我只是想讓別人查看我的代碼和建議,以便將其作爲一個精心編寫的java代碼進行改進。 我正在做的是使用掃描儀獲取用戶輸入,直到用戶在0-10之間輸入數字。資源泄漏:'in'在這個位置沒有關閉

int Ai = getInput("i", "A"); 
int Aj = getInput("j", "A"); 
int Bi = getInput("i", "B"); 
int Bj = getInput("j", "B"); 

private static int getInput(String axis, String point) { 
    int coordinate = 0; 
    boolean valid = false; 

    while(!valid){ 
     Scanner in = new Scanner(System.in); 

     System.out.println("Enter "+ axis +" for " + point +" > "); 

     if (in.hasNextInt()){ 
      coordinate = in.nextInt(); 
      if (coordinate >= 0 && coordinate <10){ 
       valid = true; 
       return coordinate; 
      } 
     } 
    } 
    return coordinate; 
} 

但我得到一個警告:在第11行「資源泄漏‘在’沒有在這個位置閉」(返回座標;)請有人可以解釋我這個

回答

2

你不必每次循環運行時實例化Scanner對象in。因此,將Scanner in = new Scanner(System.in);放置在while之上。

if塊內部不需要return塊。因valid = true裏面的if塊在while裏面評價爲false的塊。

使用此代碼來代替:

private static int getInput(String axis, String point) { 

int coordinate = 0; 
boolean valid = false; 
Scanner in = new Scanner(System.in); 
while(!valid) 
{ 
    if (in.hasNextInt()){ 
     coordinate = in.nextInt(); 
     if (coordinate >= 0 && coordinate <10){ 
     valid = true; 
     } 
    } 
} 
in.close(); 
return coordinate; 
} 

每當你在你的代碼在任何語言打開外部資源(I/O)(大多),你必須關閉外部資源。

總是在完成處理I/O後,必須關閉這些類的實例。

這裏的外部資源是System.in,您已經打開它來接受輸入,但在您的工作之後您並未關閉該資源。這就是爲什麼它要求你關閉它。

如果您關閉掃描儀in.close()您不能使用in下次獲得輸入,除非您通過實例化再次打開它。

return語句上面添加in.close()並且應該沒有錯誤。


編輯:

問題是我們在getinput()也被關閉System.in由「亨利」在評論中說,關閉Scanner

因此將其聲明爲static並在main()的末尾關閉Scanner

代碼:

import java.util.Scanner; 

public class Main{ 
    static Scanner in = new Scanner(System.in); //Declared as Static 
    private static int getInput(String axis, String point) { 

     int coordinate = 0; 
     boolean valid = false; 

     while(!valid) 
     { 
      System.out.println("Enter "+ axis +" for " + point +" > "); 
      if (in.hasNextInt()){ 
       coordinate = in.nextInt(); 
       if (coordinate >= 0 && coordinate <10){ 

       valid = true; 
       } 
      } 
     } 

     return coordinate; 
     } 
public static void main(String[] args) throws Exception 
{ 

    int Ai = getInput("i", "A"); 
    int Aj = getInput("j", "A"); 
    int Bi = getInput("i", "B"); 
    int Bj = getInput("j", "B"); 
    in.close(); // close the scanner when your program is about to end 
} 
} 
有多個輸入在一行打交道時
+0

關閉掃描儀也會關閉底層System.in,這在很多情況下不是一個好主意。 – Henry

+0

@SkrewEverything謝謝你的好解釋。我已經嘗試在return語句之上添加in.close()。然後輸入一個有效的數字(0-10)。它變成了一個無限循環。 – xyzabc

+0

@Henry然後在'main()'中打開掃描器並將輸入作爲參數傳遞給method,並在'main()'結尾關閉掃描器是個好主意? – SkrewEverything

-1

你應該使用追加以下幾行代碼

String[] in= lines.trim().split("\\s+"); 

for (int i = 0; i < 2; i++) { 
a[i] = Integer.parseInt(in[i]); 
} 

你可能不知道如果用戶按此順序輸入數據,[早期]程序將無法解析,導致該功能無法正常工作。