前提・実現したいこと
Java8で、OpenWeatherMap(https://openweathermap.org/)のAPIを叩いて天気の情報をJSONで取得して、
nashornエンジンを使ってHashMapに格納し出力するプログラムを書いていたのですが、
NullPointerExceptionが出てしまったので、自分でも調べている途中ですが
もしわかる方がいらっしゃればその方が早いのでこちらでも質問します。
WebAPI関係のコードを書くのは初めてなので後半部分のnashornエンジンを利用してHashMapに格納するところは
こちらのサイト(https://www.sejuku.net/blog/39599)のコードほぼそのままです。
初歩的な問題やもしれませんがご助力いただけると幸いです。
.
.
発生している問題・エラーメッセージ
{"coord":{"lon":139.76,"lat":35.68},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01d"}],"base":"stations","main":{"temp":29.36,"pressure":1013,"humidity":74,"temp_min":29,"temp_max":30},"visibility":16093,"wind":{"speed":4.1,"deg":190},"clouds":{"all":1},"dt":1531648560,"sys":{"type":1,"id":7622,"message":0.0078,"country":"JP","sunrise":1531596991,"sunset":1531648623},"id":1850147,"name":"Tokyo","cod":200} java.lang.NullPointerException at WeatherTest.main(WeatherTest.java:44)
.
該当のソースコード
Java
1import java.io.*; 2import java.net.*; 3import java.lang.reflect.Method; 4import java.util.*; 5 6import javax.script.ScriptEngine; 7import javax.script.ScriptEngineManager; 8 9 10 11public class WeatherTest{ 12 public static void main(String[] args) 13 { 14 String BASE_URL="http://api.openweathermap.org/data/2.5/weather"; 15 String CITY="Tokyo"; 16 String API_KEY="XXXX"; 17 18 String url=BASE_URL+"?q="+CITY+",jp&units=metric&appid="+API_KEY; 19 20 String line="";//json格納用配列 21 try { 22 // HTTP接続を確立し,処理要求を送る 23 HttpURLConnection conn = (HttpURLConnection)(new URL(url)).openConnection(); 24 conn.connect(); 25 26 //WebAPIから結果を出力 27 BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8")); 28 while( (line = br.readLine()) != null) { 29 System.out.println(line); 30 } 31 br.close(); 32 conn.disconnect(); 33 } catch (IOException ex) { 34 ex.printStackTrace(); 35 } 36 37 //jsonをhashmapに格納して出力 38 ScriptEngineManager manager = new ScriptEngineManager(); 39 ScriptEngine engine = manager.getEngineByName("nashorn"); 40 41 try { 42 Object obj = engine.eval(String.format("(%s)", line)); 43 Class scriptClass = Class.forName("jdk.nashorn.api.scripting.ScriptObjectMirror"); 44 Object[] keys = ((java.util.Set)obj.getClass().getMethod("keySet").invoke(obj)).toArray();//44行目 45 Method method_get = obj.getClass().getMethod("get", Class.forName("java.lang.Object")); 46 47 Map<String, String> map = new HashMap<>(); 48 for(Object key : keys) { 49 Object val = method_get.invoke(obj, key); 50 map.put(key.toString(), val.toString()); 51 } 52 53 System.out.println(map); 54 } catch(Exception e) { 55 e.printStackTrace(); 56 } 57 58 } 59} 60
追記
回答ですでに指摘していただいたのですが、このプログラムでnashornエンジンを使っているのには事情がありまして、
このプログラムを使う本番環境が、クラスパスを簡単に設定できないかもしれない(未確認)ので
なるべく標準ライブラリだけで記述したかったのです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/15 12:15