• ベストアンサー

間違っているところを教えて下さい

次のプログラムの間違っているところを教えて下さい。 ************************************************************** 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だった場合、「未設定」という文字列を戻り値と する処理を記述したいのですが、どのように書いたら良いので しょうか?

noname#205525
noname#205525
  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

private HashMap address; private HashMap age; で宣言している変数を address.put("yamada", "沖縄"); 初期化しないで使うのはまずいんじゃないかと。 >取得した値がnullだった場合、「未設定」という文字列を戻り値と > する処理を記述したいのですが、どのように書いたら良いので しょうか? 取得する値を null と比較して、nullだったら return "未設定"; とか。 generics使わないの? というのは書かないほうがいいんだろうか。

noname#205525
質問者

補足

おっしゃる通りHashMapの宣言しただけでは address.put("yamada", "沖縄");とかは 使えないですよね。 private HashMap address = new HashMap(); private HashMap age = new HashMap(); という感じでオブジェクトを作成してみたら、出来ました。 ただやっぱり、nullたっだ時に未設定と表示するのが 上手く出来ません。 昨日一度出来たんですが、最初からやり直したら また出来なくなっていて。 ちなみに、 >取得する値を null と比較して、nullだったら return "未設定"; とか。 ↑これを参考にして、 if(name.equals(null)){    return "未設定"; } こんな感じで記述しました。

その他の回答 (1)

回答No.2

ご自分でも言われているようにコンストラクタの処理がちょっとおかしいですよ。 address.put("yamada", "沖縄"); とありますがaddressはまだ生成されていません。 それとこのコンストラクタに渡している引数に意味はないような気が。 もう少し基礎を覚えてみてはどうでしょう。

noname#205525
質問者

お礼

if(name.equals(null)) のところを if(jyuusyo == null)にしたら ちゃんと未設定と出ました。 nullの場合はequals()メソッド使わずも==でいいんですね。 今日研修で講師に聞いて解決しました。 ありがとうございました。

noname#205525
質問者

補足

>それとこのコンストラクタに渡している引数に意味はないような気が。 本当だ・・・ 昨日無事実行・表示されたのに今日やり直したら また上手くいかなかったのでこちらを覗いてみたら、 何だかヒドイ記述してましたね。 確かに引数を渡す意味が分かりません。自分で書いたのに・・・ ちなみに書き直したプログラムは以下の通りです。 ********************************************************* 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となってしまいます。 昨日は出来たのに~! もう少し粘ってみます。 ありがとうございました。

関連するQ&A

  • なぜIDの中身が出力しないんでしょうか?

    今回もエラーもなく例外処理もありませんただ出力しないだけです キーボード入力と"20が等しいならHashMap型のIDの中身"山田"を表示、同様にキーボード入力と"10"が等しいならHashMap型のIDの中身"小林"を出力。 ソースコードはこちらです⇓ import java.util.HashMap; import java.util.*; class Sample7 { public static void main(String[] args){ System.out.println("IDを入れてください"); HashMap<String, String> ID=new HashMap<String,String>(); ID.put("20", "山田"); ID.put("10", "小林"); ID.put("40", "大林"); ID.put("90", "斉藤"); ID.put("1", "井上"); Scanner sc= new Scanner(System.in); String str=sc.nextLine(); while(true){ if(str=="20")//キーボド入力が20と等しいなら"山田"の出力する判定 System.out.println(ID.get(20)); break; } } } できたら早めの回答をお持ちしています

    • ベストアンサー
    • Java
  • javaの連想配列について教えてください

    お世話になります。 javaの連想配列について教えてください。 やりたいことは下記のようなデータを作成したいです。 ================================================ {   "shcool" : {          "class" : "A",          "yamada" : {                "class" : "AA",                "height" : 165,                "weight" : 60         },          "saitou" : {                "class" : "AB",                "height" : 170,                "weight" : 65         }   } } ================================================ 下記HPを参考してHashMap+HashMapで作成したのですがうまくいきません。 http://www.atmarkit.co.jp/fjava/javatips/081java010.html Map<String, Object> map = new HashMap<String, Object>(); map.put("school", new HashMap<String, Object>()); ((Map) map.get("school")).put("class", "A"); ((Map) map.get("school")).put("yamada", new HashMap<String, Object>()); ((Map) map.get("school")).get("yamada").put("class", "AB"); ・・・ としても下記エラーとなってしまいます。 ----------------------------------------------------- エラー: シンボルを見つけられません ((Map) map.get("school")).get("yamada").put("class", "AB");                            ^ シンボル: メソッド put(String,String) ----------------------------------------------------- 途中のschoolのvalueにHashMapを入れるところまではうまくいっているようですが、 yamadaのvalueにHashMapを入れて.put()の仕方がわかりません。。。 上記データをHashMap+HashMapで作成するにはどうしたらよいでしょうか? ぜひご教示いただけると嬉しいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • HashMapについて

    質問させてください 以下に簡単なコードをJBuilderで作成しました。 printでブレークをはってmapインスタンスを評価してみると、mapに20個のキーが登録されるはずが、 16個しかいません。 この時点でstr1[16]が評価しても表示されていないのですが、map.get()で正常に取得はできています。 どのようなことが考えられるか、わかる型がいましたら教えてください。よろしくお願いいたします。 import java.util.*; class Test { public static void main(String[]args){ HashMap map = new HashMap(); String str1[] = new String[20]; String str2[] = new String[20]; for(int i = 0; i < 20; i ++){ str1[i] = new String(Integer.toString(i)); str2[i] = new String(Integer.toString(i * 10)); map.put(str1[i],str2[i]); } System.out.println("デバック用ブレーク"); System.out.println(map.get(str1[11])); } }

    • ベストアンサー
    • Java
  • ArrayListとHashMapを利用する問題について

    『問題』 (1)ArrayListのオブジェクトを生成する。 (2)「何回入力しますか?」と出力し、入力処理を行う。 (3)(2)で入力された回数分、以下の処理を行う。   1)HashMapのオブジェクトを生成する。   2)「名前を入力して下さい。」と出力し、入力処理を行う。 3)「性別を入力して下さい。」と出力し、入力処理を行う。   4)「性別を入力して下さい。」と出力し、入力処理を行う。 5) 1)で作成したHashMapに、それぞれ入力された 名前・年齢・性別を設定する。   6)値を設定したHashMapを(1)で作成したArrayListへ格納する。 (4)ArrayListの件数分、以下の処理を行う。   1)ArrayListより、HashMapを取得する。   2)取得したHashMapより、それぞれ設定されている 名前・年齢・性別を取得する。   3)HashMapより取得した名前・年齢・性別を出力する。 『実行結果』 何回入力しますか? 2 名前を入力して下さい。 iwata 年齢を入力して下さい。 27 性別を入力して下さい。 men 名前を入力して下さい。 hana 年齢を入力して下さい。 21 性別を入力して下さい。 women 名前=iwata 年齢=27 性別=men 名前=hana 年齢=21 性別=women 上記のようなプログラムを書く問題について質問します。 (3)までは自力で書けて実行結果もこの通りになったのですが、 (4)が分からずに、実行結果では値の部分がnullと出力されて しまいました。自分でもこの記述は間違っているというのは感じる のですが、どうしたら値がちゃんと格納されるのか分かりません。 「ArrayListより、HashMapを取得する。」←特にこの部分を どう記述してよいのか・・・ 分かる方、上記の部分の記述方法だけでも構わないので教えて下さい。 『自分で書いたプログラム』 import java.util.*; import java.io.*; public class Sample02{ public static void main(String[] args)throws IOException{ ArrayList list = new ArrayList(); System.out.println("何回で入力しますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int num = Integer.parseInt(str); for(int i=0; i<num; i++){ HashMap map = new HashMap(); System.out.println("名前を入力して下さい。"); String name = br.readLine(); System.out.println("年齢を入力して下さい。"); String age = br.readLine(); System.out.println("性別を入力して下さい。"); String sex= br.readLine(); map.put("名前", name); map.put("年齢",age); map.put("性別",sex); list.add(name); list.add(age); list.add(sex); } for(int i=0; i<num; i++){ HashMap map = new HashMap(); String name = (String)map.get("名前"); String age = (String)map.get("年齢"); String sex = (String)map.get("性別"); System.out.println("名前=" + name); System.out.println("年齢=" + age); System.out.println("性別=" + sex); } } }

    • ベストアンサー
    • Java
  • クラス名を変えるとコンパイルが通らない

    interface HINA { void write(String str, int age); } class super_class { String name; int age; public void write(String str, int age){ System.out.println(str + "\t" + age); } super_class(String name, int age) { this.name = name; this.age = age; } } class sub_class extends super_class implements HINA { public void write(String str , int age) { System.out.println(str + "\t" + age); } sub_class(String str , int age) { super(str , age); } } public class test3 { public static void main(String[] args) { super_class naru = new super_class("成瀬川なる", 17); super_class shinobu = new sub_class("前原しのぶ", 13); sub_class motoko = new sub_class("青山素子", 15); if (naru instanceof HINA) naru.write(naru.name, naru.age); if (shinobu instanceof HINA) shinobu.write(shinobu.name, shinobu.age); if (motoko instanceof HINA) motoko.write(motoko.name, motoko.age); } } これのsuper_classをOyaに、sub_classをKoにするとコンパイルエラーになります。 何故なんでしょう。 分かる方がいましたら、教えて下さい。 どうぞ宜しくお願い致します。 それと見づらくてどうもすいません。

    • ベストアンサー
    • Java
  • hashMap.getについて

    たびたび、ご質問させて頂きます。 申し訳ありません。 hashMap.getについてなんですが 以下のようにhashMapを設定しました。 --------------------- public class TestMap { /*HashMap生成(クラス変数)*/ class MyData{ public String sDate; public String sName; } ・ ・ ・ Key = oStringTokenizer.nextToken(); oMyData.sDate = oStringTokenizer.nextToken(); oMyData.sName = oStringTokenizer.nextToken(); hashMap.put(Key,oMyData); ----------------- データを取り出したいので、(inputKey)=入力キー --------------- String[] value = (String[]) hashMap.get(inputKey); System.out.println("日付:" + value[1] + " 名前:" + value[2]); --------------- と、したんですが、エラーは出ないもののSystem.out.printlnの箇所でなにも表示されません。 たびたび、ご質問させて頂いて本当に申し訳ありませんが、ご教授して頂けたら幸いです。

    • ベストアンサー
    • Java
  • ArrayListを使ったクラスの作成の仕方

    次のプログラム、どこが間違っているのでしょうか? コンパイルは通るのですが、実行しようとすると ずら~っとエラーが出てしまいます。 (例)at java.lang.ClassLoader.defineClass1(Native Method) at java.security.SecureClassLader.defineClass..... at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) ********************************************************** package siryou; import java.util.ArrayList; import java.io.*; class Info { private String name; private String age; private String nationality; public void setName(String nm) { name = nm; } public void setAge(String a) { age = a; } public void setNationality(String nt) { nationality = nt; } public void show(String j) { System.out.println("「名前=" + name + "」"); System.out.println("「年齢=" + age + "」"); System.out.println("「国籍=" + nationality + "」"); } } class Kojinjyoho02 { public static void main(String args[])throws IOException { System.out.println("何回入力しますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int res = Integer.parseInt(str); Info in = new Info(); ArrayList list = new ArrayList(); for(int i =0; i < res; i++){ System.out.println("名前は?"); str = br.readLine(); in.setName(str); System.out.println("年齢は?"); str = br.readLine(); in.setAge(str); System.out.println("国籍は?"); str = br.readLine(); in.setNationality(str); list.add(in); } for(int j=0; j < list.size(); j++){ String jyoho = (String)list.get(j); in.show(jyoho); } } }

    • ベストアンサー
    • Java
  • javaのプログラムで分からない箇所があります

    public class Addkensaku { //読み込むファイルのパス private static final String FILE_PATH = ""; private static enum SearchMode { NAME, AGE, ADDR, REGIST, EXIT } private static final Map<String, SearchMode> modeMap; static { modeMap = new HashMap<String, Addkensaku.SearchMode>(); modeMap.put("1", SearchMode.NAME); modeMap.put("2", SearchMode.AGE); modeMap.put("3", SearchMode.ADDR); modeMap.put("5", SearchMode.REGIST); modeMap.put("9", SearchMode.EXIT); } public static void main(String[] args) throws IOException { BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); String mode = null; System.out.println("何をしますか?\n1.名前(ファーストネーム)で検索\n2.フルネームで検索\n3.年齢で検索\n4.都道府県で検索\n5.追加"); mode = buf.readLine(); if (!checkSearchMode(mode)) { System.out.println("入力値が不正です"); return; } // 読み込み List<Addr> allData = readData(FILE_PATH); SearchMode enmMode = modeMap.get(mode); // 検索 String keyword = null; List<Addr> answer = search(allData, enmMode, keyword); } private static List<Addr> readData(String path) { return null; } //ファイル書きこみ private static void writeData(String path) { } private static List<Addr> search(List<Addr> allData, SearchMode mode, String keyword) { if(SearchMode.NAME == mode){ } if (SearchMode.AGE == mode) { for (Addr record : allData) { record.getName(); } if(SearchMode.ADDR == mode){ } } return null; } private static boolean checkSearchMode(String value) { return modeMap.get(value) != null; } } クラスAddr.java public class Addr { private String name; private String age; private String add; //データ更新用メソッド public void setName(String name) { this.name = name; } public void setAge(String age) { this.age = age; } public void setAdd(String add) { this.add = add; } //参照メソッド public String getName() { return name; } public String getFirstName() { return name.split(" ")[1]; } public String getAge() { return age; } public String getAdd() { return add; } } 二つのクラスを使いテキストファイルの中身を読み込み検索しようとしています ですがパスの指定場所はあっているはずなのですがうまくファイルが読み込めなくここからどのように作っていけばいいかわからず困っています

  • javaに関しての質問です (エラー)

    最近javaの勉強を始めたばかりの者です とある動画をみながら勉強をしていたのですが なぜかエラーが出てしまいます。 エラーの内容は... エラー:この文に制御が移ることはありません     if( c== 13){ エラー:return文が指定されていません この二つです、もし解決方法がわかる方がいましたらぜひ教えてくれるとうれしいです 下がソースコードになります。 public class part01 { static String name = "すけさん"; static int lv = 30; public static void main( String[] args )throws java.io.IOException { putzyosyou(); // 序章を表示 putcommnd(); if(lv<40){ putgameover(); }else{ putgamecrear(); } } public static void putzyosyou() { System.out.println("魔王が世界を滅ぼそうとしている。"); System.out.println(name + "はレベルが" + lv + "のツワモノです"); } public static void putcommnd()throws java.io.IOException { System.out.println("1.魔王を倒しに行く"); System.out.println("2.修行する"); System.out.println("3.だれかに頼る"); System.out.println("4.そんなことよりも寝よう"); int c = inputcommnd(); if( c== '1' ){ System.out.println("魔王が現れた!!"); }else if( c== '2' ){ lv += 2; System.out.println ("レベルが"+ lv + "になった!!"); putcommnd(); } } public static int inputcommnd()throws java.io.IOException { int c = System.in.read(); if( c== 10){ return( inputcommnd() ); if( c== 13){ return( inputcommnd() ); } return( c ); } } public static void putgameover() { System.out.println(name + "は負けました。"); System.out.println("GAME OVER"); } public static void putgamecrear() { String str = name + "は魔王を倒しました。"; put( str ); if(lv>120){ System.out.println("レベル" + lv + "なので魔王ゴミでした"); }else if(lv>80){ System.out.println("レベル" + lv + "なので余裕でした"); }else if(lv>50){ System.out.println("レベル" + lv + "なので倒せました"); }else{ System.out.println("レベル" + lv + "なので苦戦しました"); } System.out.println("GAME CREAR"); } static void put( String str ) { System.out.println( str ); } }

    • ベストアンサー
    • Java
  • 以下のコードのどこが問題なのでしょうか?

    java初心者です。よろしくお願いいたします。以下のコードはどこに問題があるのでしょうか?よろしくお願いいたします。 public class Sample2 { public static void main(String[] args1,String[] args2) { MyObject object = new MyObject(); object.setName("mikel" , "jun"); String s = object.getName(); System.out.println(s); } } class MyObject { String name; public void setName(String str1,String str2) { name = "str1"+"str2"; } public String getName() { return name; } }

    • ベストアンサー
    • Java