代码之家  ›  专栏  ›  技术社区  ›  Duelist

使用source.fromresource从文件读取时处理NullPointerException

  •  0
  • Duelist  · 技术社区  · 6 年前

    我有一种奇怪的行为 Source.fromResource() 方法读取不存在的文件时。据我所知,它应该会回来的 null 所以我把它包起来 Option . 但当匹配它时,它被识别为 Some 我得到了 NullPointerException .

    readfromfileexample.scala:从文件中读取:

    object ReadFromFileExample extends App {
    
      import scala.io.Source
    
      val sourceOpt = Option(Source.fromResource("non_existing_file.txt"))
    
      assert (sourceOpt.isDefined) // but it should return false
    
      sourceOpt match {
        case Some(source) => source.getLines()
        case None => throw new RuntimeException("Error reading from file")
      }
    
    }
    

    如何解释这种行为?

    UPD

    我错了。它应该返回非 无效的 类型的值 BufferedSource . 但我怀疑它能返回值 无效的 类型 BufferedLineIterator . 我不明白它是怎么回来的 空指针异常 而不是 缓冲线迭代器

    2 回复  |  直到 6 年前
        1
  •  1
  •   Duelist    6 年前

    Try Option

    import scala.util.{Failure, Success, Try}
    
    object ReadFromFileExample extends App {
    
      import scala.io.Source
    
      Try(Source.fromResource("non_existing_file.txt").getLines()) match {
        case Success(lines) => // handling lines
        case Failure(e) => println(s"An error has occured, cause: $e")
      }
    }
    

    NullPointerException getLines()

    fromResource classLoader.getResourceAsStream() InputStream null

    Reader lock

    //...
    
    protected Reader(Object lock) {
        if (lock == null) {
            throw new NullPointerException();
        }
        this.lock = lock;
    }
    
    //...
    

    Exception in thread "main" java.lang.NullPointerException
        at java.io.Reader.<init>(Reader.java:78)
        at java.io.InputStreamReader.<init>(InputStreamReader.java:129)
        at scala.io.BufferedSource.reader(BufferedSource.scala:22)
        at scala.io.BufferedSource.bufferedReader(BufferedSource.scala:23)
        at scala.io.BufferedSource.charReader$lzycompute(BufferedSource.scala:33)
        at scala.io.BufferedSource.charReader(BufferedSource.scala:31)
        at scala.io.BufferedSource.scala$io$BufferedSource$$decachedReader(BufferedSource.scala:60)
        at scala.io.BufferedSource$BufferedLineIterator.<init>(BufferedSource.scala:65)
        at scala.io.BufferedSource.getLines(BufferedSource.scala:84)
        at ReadFromFileExample$.delayedEndpoint$ReadFromFileExample$1(ReadFromFileExample.scala:12)
    
        2
  •  0
  •   gekomad    6 年前

    import scala.io.Source
    
    val sourceTry = Try(Source.fromFile("non_existing_file.txt"))
    
    sourceTry match {
      case Success(source) => source.getLines()
      case Failure(f) => println(f.getMessage)
    }