質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1670閲覧

lateinitを参照するため初期化したい

yu9718s

総合スコア9

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/06/29 06:36

編集2020/06/30 23:49

前提・実現したいこと

ボタンを押すと画像をダウンロードするアプリを作りたい

発生している問題・エラーメッセージ

lateinit property urlConnection has not been initialized

該当のソースコード

GetImage

1class GetImage(context: Context, var url: String) : GetImageBase<Bitmap>(context) { 2 private lateinit var urlConnection: HttpURLConnection 3 4 override fun loadInBackground(): Bitmap? { 5 Log.v("nullpo", "loadInBackGround") 6// urlConnection = (url as HttpURLConnection?)!! 7 8 val url: URL = URL(url) 9 10 try { 11 12 urlConnection = (url.openConnection() as HttpURLConnection).also { 13 it.requestMethod = "GET" 14 it.connectTimeout = 1000 15 it.readTimeout = 10000 16 it.connect() 17 } 18 return when (urlConnection.responseCode) { 19 HttpsURLConnection.HTTP_OK -> { 20 BitmapFactory.decodeStream(urlConnection.inputStream) 21 } 22 else -> { 23 null 24 } 25 } 26 } catch (e: Exception) { 27 return null 28 } finally { 29 urlConnection.disconnect() 30 } 31 } 32}
E/AndroidRuntime: FATAL EXCEPTION: ModernAsyncTask #1 Process: jp.co.stv_tech.test_download_2, PID: 4116 java.lang.RuntimeException: An error occurred while executing doInBackground() at androidx.loader.content.ModernAsyncTask$3.done(ModernAsyncTask.java:164) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) at java.util.concurrent.FutureTask.setException(FutureTask.java:223) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:762) Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.net.HttpURLConnection at jp.co.stv_tech.test_download_2.GetImage.loadInBackground(GetImage.kt:16) at jp.co.stv_tech.test_download_2.GetImage.loadInBackground(GetImage.kt:11) at androidx.loader.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:307) at androidx.loader.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:60) at androidx.loader.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:48) at androidx.loader.content.ModernAsyncTask$2.call(ModernAsyncTask.java:141) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)  at java.lang.Thread.run(Thread.java:762) 

試したこと

調べてみると初期化されていないことに対してのエラーでした。
さらに初期化=代入との記載もありましたので下記のコードを試してみました。
urlConnection = (url as HttpURLConnection?)!!

しかし、その結果は下記のようなエラーがでてきました。
String cannot be cast to java.net.HttpURLConnection

初期化するために私の試したコードは何が間違っているのでしょうか
どなたかご教示お願いいたします。

E/AndroidRuntime: FATAL EXCEPTION: ModernAsyncTask #1 Process: jp.co.stv_tech.test_download_2, PID: 2831 java.lang.RuntimeException: An error occurred while executing doInBackground() at androidx.loader.content.ModernAsyncTask$3.done(ModernAsyncTask.java:164) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383) at java.util.concurrent.FutureTask.setException(FutureTask.java:252) at java.util.concurrent.FutureTask.run(FutureTask.java:271) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:764) Caused by: kotlin.UninitializedPropertyAccessException: lateinit property urlConnection has not been initialized at jp.co.stv_tech.test_download_2.GetImage.loadInBackground(GetImage.kt:38) at jp.co.stv_tech.test_download_2.GetImage.loadInBackground(GetImage.kt:11) at androidx.loader.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:307) at androidx.loader.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:60) at androidx.loader.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:48) at androidx.loader.content.ModernAsyncTask$2.call(ModernAsyncTask.java:141) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)  at java.lang.Thread.run(Thread.java:764) 

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2020/06/30 08:02

そのエラーはどこで出てますか? also ブロックの中で例外が発生すると urlConnection は初期化されないままなので、finally でエラーになるかも。 そもそも urlConnection はローカル変数で十分な気がしますが…。
yu9718s

2020/06/30 09:35

申し訳ございませんが、どこからでてるエラーなのか理解不足により説明ができないため エラー内容を追記いたします。
hoshi-takanori

2020/06/30 10:38

追記していただいたのは String cannot be cast to java.net.HttpURLConnection の方ですね。 文字列は HttpURLConnection にキャストできませんので、urlConnection = (url as HttpURLConnection?)!! すれば当然エラーになります。 お聞きしたかったのは lateinit property urlConnection has not been initialized というエラーがどこで出ていたかなのですが…。
yu9718s

2020/06/30 23:50

汲み取れず申し訳ございません。 再度エラー内容を追記いたしました。
guest

回答1

0

ベストアンサー

動かそうとしているAndroidのバージョンが9.0以上であるとしたら、デフォルトでHTTPの通信が制限されているので、そのための対処をしないとurl.openConnection()の段階で例外が飛ぶと思われます。そうするとurlConnectionへの代入が行われないままfinallyのurlConnection.disconnect()が実行されようとするので、質問にあるエラーが起きているのではないでしょうか。

下記資料を参考にしてres/xml/network_security_config.xmlを作成し、AndroidManifest.xmlへの記述を追加することで回避できるのではないかと思います。

ネットワーク セキュリティ構成 | Android Developers
Android 9(Pie)でHTTP通信を有効にする | Qiita


Android 7.0の端末なら上記の問題は影響しないでしょう。それならば、AndroidManifest.xmlに

xml

1 <uses-permission android:name="android.permission.INTERNET" />

の記述はありますか?それがない場合も、同様にurlConnectionへの代入が行われずにfinallyブロックが走るでしょう。

後は、ネットワーク処理がUIスレッド上で走っている場合もやはり代入が行われず例外が飛ぶので、同じ結果になると思います。別スレッドで走るように実装されているでしょうか。

投稿2020/06/30 13:41

編集2020/07/01 08:51
keicha_hrs

総合スコア6768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu9718s

2020/07/01 00:00

ご丁寧にありがとうございます。 参考にさせていただきます。 ただ、動かそうとしているAndroidのバージョンは7.0なのでもしかしたら違うかもしれませんが試してみます。
yu9718s

2020/07/02 01:04

manifestへの記述を追加したところ正常に動作いたしました。 エラーのパターンをご教示いただきありがとうございます。 今後同じようなエラーが出た際に参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問