2016-07-20 7 views
0

Ich bin neu in Lambda-Ausdrücke in Java und ich bin nicht sicher, ob es zusätzlich schließen Scanner in dem Block, Lambda-Ausdrücke notwendig ist:Ist es notwendig, den Scanner innerhalb der Block Lambda Expressions zu schließen?

public interface factorialInterface { 
    int factorialMe (int n); 
    } 


import java.util.Scanner; 
public class factorialDemo { 
    public static void main(String args[]) { 
     Scanner keyb = new Scanner (System.in); 

     factorialInterface fact = (n) -> { 
      int result = 1; 

      for (int i = 1; i <= n; i++) { 
       result = i * result; 
      } 
      keyb.close(); // <- not sure about this one. 
      return result; 
     }; 
     System.out.print("Pass value: "); 
     System.out.println(fact.factorialMe(keyb.nextInt())); 
     System.out.println(); 


     keyb.close(); 

    } 

} 

Wenn ich nicht schließen ‚Tast‘ diese innen Block Eclipse wird mich über das Ressourcenleck informieren. Ist es immer empfehlenswert, den Scanner innerhalb des Lambda Blocks zu schließen? Danke für Hilfe!

+1

Sind Sie sicher, dass Sie 'System.in' schließen möchten? – bradimus

+1

Ich würde sagen, Eclipse ist falsch daran. Es gibt keinen Grund dafür, dass Ihr Lambda etwas mit dem Scanner zu tun hat. – njzk2

+0

Schließen Sie immer einen 'Scanner', außer * einen' Scanner' auf 'System.in'. Sie sollten 'System.in' niemals schließen. Eclipse hat diese Ausnahme nicht, also müssen Sie es sagen, indem Sie '@SuppressWarnings (" resource ")' in die Zeile direkt vor 'Scanner keyb = ...' einfügen. – Andreas

Antwort

0

Sie verwenden keyb nicht innerhalb fact in einer anderen Weise außer es zu schließen. Es gehört absolut nicht dorthin. Die Berechnung einer Fakultät von n ist eine reine Funktion, die nur von n und nichts anderes abhängt.

Dies ist wahrscheinlich ein Fehler in Eclipse. Versuchen Sie, die Deklaration von keyb näher an ihre Verwendung zu verschieben, also direkt nach print("Pass value: ").

+0

Das sind genau meine Gedanken! Danke für die Antwort. Normalerweise würde ich die abschließende Anweisung niemals in den Block schreiben, weil es (wie du sagtest) nichts mit dem Scanner zu tun hat, aber seit ich vor ungefähr einer Stunde angefangen habe über Lambda Expressions zu lesen, wollte ich nur sichergehen, dass ich es bin nichts zu verpassen. –

Verwandte Themen