- ベストアンサー
間違っているところを教えて下さい
次のプログラムの間違っているところを教えて下さい。 ************************************************************** package siryou; import java.io.*; import java.util.HashMap; class Meibo { private HashMap address; private HashMap age; public Meibo(String s) { address.put("yamada", "沖縄"); address.put("sato", "東京"); address.put("tanaka", "北海道"); address.put("ikeda", "アメリカ"); age.put("yamada", "21歳"); age.put("sato", "30歳"); age.put("tanaka", "55歳"); age.put("ikeda", "12歳"); } public String getAddress(String n) { String name = n; String jyuusyo = (String)address.get(name); return jyuusyo; } public String getAge(String n) { String name = n; String nennrei = (String)age.get(name); return nennrei; } } class MeiboMain { public static void main(String args[])throws IOException { System.out.println("名前を入力して下さい。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); Meibo mi = new Meibo(str); mi.getAddress(str); String jyuusyo = mi.getAddress(str); System.out.println(str + "さんの住所は" + jyuusyo + "です。"); mi.getAge(str); String nennrei = mi.getAge(str); System.out.println(str + "さんの年齢は" + nennrei + "です。"); } } *************************************************************** 恐らくコンストラクタ内の処理が間違っていると思うんですが・・・ 実行すると、「NullPointerException」が出てしまいます。 渡した引数の処理がちゃんと出来ていないのかな?と思った のですが、どういう風に記述してよいのか分からなくて。 また、メソッド内で 取得した値がnullだった場合、「未設定」という文字列を戻り値と する処理を記述したいのですが、どのように書いたら良いので しょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
private HashMap address; private HashMap age; で宣言している変数を address.put("yamada", "沖縄"); 初期化しないで使うのはまずいんじゃないかと。 >取得した値がnullだった場合、「未設定」という文字列を戻り値と > する処理を記述したいのですが、どのように書いたら良いので しょうか? 取得する値を null と比較して、nullだったら return "未設定"; とか。 generics使わないの? というのは書かないほうがいいんだろうか。
その他の回答 (1)
- takahirown
- ベストアンサー率25% (1/4)
ご自分でも言われているようにコンストラクタの処理がちょっとおかしいですよ。 address.put("yamada", "沖縄"); とありますがaddressはまだ生成されていません。 それとこのコンストラクタに渡している引数に意味はないような気が。 もう少し基礎を覚えてみてはどうでしょう。
お礼
if(name.equals(null)) のところを if(jyuusyo == null)にしたら ちゃんと未設定と出ました。 nullの場合はequals()メソッド使わずも==でいいんですね。 今日研修で講師に聞いて解決しました。 ありがとうございました。
補足
>それとこのコンストラクタに渡している引数に意味はないような気が。 本当だ・・・ 昨日無事実行・表示されたのに今日やり直したら また上手くいかなかったのでこちらを覗いてみたら、 何だかヒドイ記述してましたね。 確かに引数を渡す意味が分かりません。自分で書いたのに・・・ ちなみに書き直したプログラムは以下の通りです。 ********************************************************* import java.io.*; import java.util.*; class Meibo { private HashMap address = new HashMap(); private HashMap age = new HashMap(); public Meibo() { address.put("yamada", "沖縄"); address.put("sato", "東京"); address.put("tanaka", "北海道"); address.put("ikeda", "アメリカ"); age.put("yamada", "21歳"); age.put("sato", "30歳"); age.put("tanaka", "55歳"); age.put("ikeda", "12歳"); } public String getAddress(String n) { String name = n; String jyuusyo = (String)address.get(name); if(name.equals(null)){ return "未設定"; } return jyuusyo; } public String getAge(String n) { String name = n; String nenrei = (String)age.get(name); if(name.equals(null)){ return "未設定"; } return nenrei; } } class MeiboMain { public static void main(String args[])throws IOException { System.out.println("名前を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); Meibo mi = new Meibo(); String jyuusyo2 = mi.getAddress(str); System.out.println(str + "さんの住所は" + jyuusyo2 + "です。"); String nenrei2 = mi.getAge(str); System.out.println(str + "さんの年齢は" + nenrei2 + "です。"); } } ********************************************************** 上記のプログラムにて、コンストラクタ内で設定したKeyの名前を 入力したときはちゃんと表示されるんですけど、 それ以外を入力したとき「未設定」と表示されなくちゃいけない のがnullとなってしまいます。 昨日は出来たのに~! もう少し粘ってみます。 ありがとうございました。
補足
おっしゃる通りHashMapの宣言しただけでは address.put("yamada", "沖縄");とかは 使えないですよね。 private HashMap address = new HashMap(); private HashMap age = new HashMap(); という感じでオブジェクトを作成してみたら、出来ました。 ただやっぱり、nullたっだ時に未設定と表示するのが 上手く出来ません。 昨日一度出来たんですが、最初からやり直したら また出来なくなっていて。 ちなみに、 >取得する値を null と比較して、nullだったら return "未設定"; とか。 ↑これを参考にして、 if(name.equals(null)){ return "未設定"; } こんな感じで記述しました。