Mam śledzić kod SCALA:

val file = new FileReader("myfile.txt")
try {
 // do operations on file
} finally {
  file.close() // close the file
}

Jak radzić sobie z plikiem FileNotFoundexception, gdy przeczytałem plik? Jeśli umieściłem tę linię w bloku, nie mogę uzyskać dostępu do zmiennej pliku wreszcie wreszcie.

0
Mandroid 22 listopad 2020, 19:10

1 odpowiedź

Najlepsza odpowiedź

Dla scala 2.13 : Możesz wystarczyć Using, aby nabyć niektóre zasoby i release automatycznie bez obsługi błędów, jeśli jest to AutoClosable:

import java.io.FileReader
import scala.util.Using

val newStyle: Try[String] = Using(new FileReader("myfile.txt")) { 
  reader: FileReader =>
    // do something with reader
    "something"
}
newStyle
// will be 
// Failure(java.io.FileNotFoundException: myfile.txt (No such file or directory))
// if file is not found or Success with some value it will not fall

scala 2.12 :

Możesz owinąć tworzenie czytnika za pomocą scala.util.Try i jeśli spadnie na stworzenie, otrzymasz Failure za pomocą FileNotFoundException wewnątrz.

import java.io.FileReader
import scala.util.Try

val oldStyle: Try[String] = Try{
  val file = new FileReader("myfile.txt")
  try {
    // do operations on file
    "something"
  } finally {
    file.close() // close the file
  }
}
oldStyle
// will be 
// Failure(java.io.FileNotFoundException: myfile.txt (No such file or directory))
// or Success with your result of file reading inside

Zalecam nie używać bloków try ... catch w kodzie SCALA. Nie wpisuje się w niektórych przypadkach i może prowadzić do nieokonujących wyników, ale do zwolnienia niektórych zasobów w starych wersjach SCALA jest jedyny sposób na to - przy użyciu {x2}} - {x2}} - finally.

3
Boris Azanov 22 listopad 2020, 16:58