web-dev-qa-db-ja.com

Kotlinでのエラー「nullでなければなりません」

.Zipファイルには複数のファイルがあり、それらを取得しようとしています。ファイルを解凍しようとすると、Java.lang.IllegalStateExceptionが発生します。zis.nextEntryは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()
        }
    }
13
Petras Bartusis

このvar ze: ZipEntryのように変数zeを定義します。そのため、タイプはZipEntryであり、ZipEntry?(nullableタイプ)ではありません。

var ze: ZipEntryvar ze: ZipEntry?で変更すると、変数はnullになる可能性があります。

ドキュメントで Null Safety を確認できます。 Kotlinの大きな問題の1つです。

2
Kevin Robatel

ここに私を導くこの機能を構築しようとすると、同様の問題がありました。 zipEntryをヌル可能にすると、zipEntryを言ったifステートメントでエラーがポップアップしましたか? zipEntryとの不一致です。zipEntryを使用して解決できました!! nullでないことを保証します。

      while(zippedFile != null) {
            fileName = zippedFile.name //It wasn't able to smart cast once zipEntry was nullable
            if (zippedFile.isDirectory) {} //Here it had a type mismatch

これが解決できたソリューションです。

  while(zippedFile != null) {
            fileName = zippedFile!!.name //Adding !! (not null) allowed it to safely smart cast
            if (zippedFile!!.isDirectory) {} //Here adding not null removed the type mismatch

Kotlinで働いている人がこの問題にぶつかった場合、私はそれが助けになることを願っています!

0
HamBeast