2017-10-10 23 views
2

取得しようとしている.zipファイルには複数のファイルがあります。ファイルを解凍しようとすると、java.lang.IllegalStateExceptionが発生します。zis.nextEntryをnullにすることはできません。どのように正しい方法でそれを行うには?Kotlinでエラー「nullでない」

@Throws(IOException::class) 
    fun unzip(zipFile: File, targetDirectory: File) { 
     val zis = ZipInputStream(
       BufferedInputStream(FileInputStream(zipFile))) 
     try { 
      var ze: ZipEntry 
      var count: Int 
      val buffer = ByteArray(8192) 
      ze = zis.nextEntry 
      while (ze != null) { 
       val file = File(targetDirectory, ze.name) 
       val dir = if (ze.isDirectory) file else file.parentFile 
       if (!dir.isDirectory && !dir.mkdirs()) 
        throw FileNotFoundException("Failed to ensure directory: " + dir.absolutePath) 
       if (ze.isDirectory) 
        continue 
       val fout = FileOutputStream(file) 
       try { 
        count = zis.read(buffer) 
        while (count != -1) { 
         fout.write(buffer, 0, count) 
         count = zis.read(buffer) 
        } 
       } finally { 
        fout.close() 
        zis.closeEntry() 
        ze = zis.nextEntry 
       } 
      } 
     } finally { 
      zis.closeEntry() 
      zis.close() 
     } 
    } 
+0

メソッドを呼び出すコードを表示します。 – zulq

答えて

1

ZipEntryあなたは、ストリームから読み込まれますが、ファイルの終わりに達したときnullとなりますので、あなたは、あなたがNULL可能で、それを保存する変数を作成する必要があります。

var ze: ZipEntry? 

あなたが許可されましたプラットフォームのタイプがZipEntry!であるため、Java APIであるため、読み取る値をnull以外の変数に割り当てることができます。この場合は、nullであるかどうかを判断する必要があります。詳細については、プラットフォームタイプについてのdocsを参照してください。

0

のような変数zeを定義します。そのタイプはZipEntryであり、ZipEntry?(ヌル可能タイプ)ではありません。

var ze: ZipEntryvar ze: ZipEntry?に変更すると、変数にnullを設定できます。

Null Safetyのドキュメントを確認できます。それはKotlinとの大きな違いの一つです。

関連する問題