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

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

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

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

Q&A

解決済

1回答

5415閲覧

androidでwebAPIからJSON取得

seita1224

総合スコア14

Android

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

1グッド

1クリップ

投稿2016/10/12 10:42

androidでwebAPIからJSONを取得してこようとしているのですがエラーが出てしまいなかなかパースするところまでたどり着けません

package com.example.seita_v.myapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.net.MalformedURLException; import java.net.URL; public class MainActivity extends AppCompatActivity { TextView textView = null; Button button = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView)findViewById(R.id.textview); button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { new testAsycTask().execute(new URL("http://weather.livedoor.com/forecast/webservice/json/v1?city=400040")); } catch (MalformedURLException e) { e.printStackTrace(); } } }); } }
package com.example.seita_v.myapplication; import android.os.AsyncTask; import android.util.Log; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; /** * Created by seita_v on 2016/10/12. */ public class testAsycTask extends AsyncTask<URL,Void,String> { @Override protected String doInBackground(URL...urls) { // 取得したテキストを格納する変数 final StringBuilder result = new StringBuilder(); // アクセス先URL final URL url = urls[0]; HttpURLConnection con = null; try { // ローカル処理 // コネクション取得 con = (HttpURLConnection) url.openConnection(); con.setDoInput(true); con.connect(); // HTTPレスポンスコード final int status = con.getResponseCode(); Log.d("debug",Integer.toString(status)); if (status == HttpURLConnection.HTTP_OK) { Log.d("debug",result.toString()); // 通信に成功した // テキストを取得する final InputStream in = con.getInputStream(); final String encoding = con.getContentEncoding(); final InputStreamReader inReader = new InputStreamReader(in, encoding); final BufferedReader bufReader = new BufferedReader(inReader); String line = null; // 1行ずつテキストを読み込む while ((line = bufReader.readLine()) != null) { result.append(line); } bufReader.close(); inReader.close(); in.close(); } Log.d("debug",result.toString()); } catch (MalformedURLException e1) { e1.printStackTrace(); } catch (ProtocolException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } finally { if (con != null) { // コネクションを切断 con.disconnect(); } } return result.toString(); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); Log.d("結果",s); } }
10-12 06:28:59.897 18588-18661/com.example.seita_v.myapplication E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 Process: com.example.seita_v.myapplication, PID: 18588 java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:300) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) at java.util.concurrent.FutureTask.setException(FutureTask.java:222) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:841) Caused by: java.lang.NullPointerException: charsetName == null at java.io.InputStreamReader.<init>(InputStreamReader.java:81) at com.example.seita_v.myapplication.testAsycTask$override.doInBackground(testAsycTask.java:46) at com.example.seita_v.myapplication.testAsycTask$override.access$dispatch(testAsycTask.java) at com.example.seita_v.myapplication.testAsycTask.doInBackground(testAsycTask.java:0) at com.example.seita_v.myapplication.testAsycTask.doInBackground(testAsycTask.java:19) at android.os.AsyncTask$2.call(AsyncTask.java:288) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  at java.lang.Thread.run(Thread.java:841) 

エラーが起きている理由を教えていただけると大変ありがたいです。

sekaikan_ozaki👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

testAsycTaskの46行目で読んでいるメソッドのなかでNullPointer例外が発生していますね。
その行には何が書かれていますか?

投稿2016/10/12 11:23

yona

総合スコア18155

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

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

seita1224

2016/10/12 11:44

46行目には final InputStreamReader inReader = new InputStreamReader(in, encoding); と書かれています。
yona

2016/10/12 11:59

inまたはencodingがnullではないか確認してください。
seita1224

2016/10/12 12:26

ありがとうございます! inはnullではないみたいですが encodingがnullになってしまっているみたいです。 質問に質問を重ねてしまって申し訳ないのですが このような場合はどのようにしてエンコードを取得するとよいか教えていただけるとありがたいです。
yona

2016/10/12 12:33 編集

取れないものはどうしようもないです。 デフォルトのエンコードを設定するしかないと思います。 そもそも、 エンコードの設定自体しなくてもいいと思います。
seita1224

2016/10/12 13:01

InputStreamReaderにはエンコードを指定しないといけないという認識で使っていたので必死にエンコードについて調べていました・・・(笑) とりあえず表示もうまくできたので解決しました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問