- ベストアンサー
クラスに行って、戻ってくる方法 その2
http://oshiete1.goo.ne.jp/kotaeru.php3?q=592441 の方で質問させて頂いて、丁寧に答えて頂いたんですが、どうしても分からないので再度ご質問させて頂きます。 以前お答えして頂いたことから、TestMap.javaとjukou.javaを以下のように変更してみました。 jukou.java ------------- public class jukou extends HttpServlet { public jukou() { String sDate; String sName; } public void init(ServletConfig con) throws ServletException { super.init(con) ; } .... /* LOOKUP用処理 */ else if (req.getParameter("map") != null) { jukou x; x = TestMap.method(strings) ; .... TestMap.java ------------- public class TestMap { /*HashMap生成(クラス変数)*/ class MyData{ public String sDate; public String sName; } .... //呼び出し MyData myData = (MyData) hashMap.get(inputKey); jukou myData2 = new jukou(myData) ; エラー内容 C:\ja>javac jukou.java jukou.java:95: 互換性のない型 検出値 : void 期待値 : jukou x = TestMap.method(strings) ; ^ jukou.java:205: シンボルを解決できません。 シンボル: 変数 pw 場所 : jukou の クラス pw.println("<html><head>") ; ^ jukou.java:206: シンボルを解決できません。 シンボル: 変数 pw 場所 : jukou の クラス pw.println("<title>エラー</title>") ; ^ など9個 この他にも色々なパターンを試してみましたが、エラーが取れません。ご教授して頂けたら幸いです。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
再び#1です。 >//jukou myData2 = new jukou(myData); //myData2の使用目的が不明 >がないと、TestMap.javaからjukou.javaに戻れないような気がするんですが、その辺はどうなんでしょうか? ----------------------------------- jukou myData2 = new jukou(myData); ----------------------------------- このコードが実行されるとTestMap中にjukouクラスのインスタンス"myData2"が生成されることはわかりますか? TestMapからjukouに戻るのではなく、TestMapがjukou(厳密にはjukouクラスのコンストラクタ)を呼んでいるのです。 ----------------------------------- new jukou( myData ); ----------------------------------- の部分は、jukouクラスのコンストラクタにMyDataクラスを渡しています。ですので、jukouクラスには... ----------------------------------- public jukou( MyData myData ){ ... } ----------------------------------- というコンストラクタが存在しなければなりません。 あと、使用目的が不明と書いたのは"myData2"はTestMapクラスで使用していないからです。使用されていないのにインスタンスを生成する必要はありませんよね。 この説明がわからないという場合は、お手持ちのJava参考書の2章、3章辺りから読み直してください。もちろん例題を実際に書き実行してみて、どのように動いているかということも理解してくださいね。 説明が理解できた場合は、jukou.javaのソースを見せてください。
その他の回答 (7)
- aloop
- ベストアンサー率23% (10/43)
あの・・・最低限、今までの回答を踏まえたソースを載せましょうよ。 コンパイルが通るようにはできます。 ですが、そうしたところであなたが望んだプログラムはできないでしょうし、その前にあなたの為にもなりません。 ところで、 あなたはこのプログラムがどのように動いてほしいのかを教えてもらえませんか?
お礼
こんにちは。 ご返事有り難うございました。 >今までの回答を踏まえたソースを載せましょうよ。 全くその通りです。申し訳ございません。 >あなたはこのプログラムがどのように動いてほしいのかを教えてもらえませんか? jukou.javaは、jukou.htmlからデータを取得してテキストファイルに書き出すというサーブレットです。その一部の機能として、名前や住所を入力せずに済むようにTestMap.javaを動かしたいのです。例えば、AというテキストファイルにIDと名前や住所を入れといて、jukou.htmlでIDを入力すると、Aから名前と住所を引っ張ってくるという、ACCESSやEXCELでいうLOOKUPをしたいんですが・・・。 お陰様でエラーは取れました。
- tyoufu
- ベストアンサー率28% (19/67)
補足ありがとうございます 殆ど#5さんが回答されているので、データのやり取りの部分をするためにちょっと変更を。 自分としては、MyDataを別Publicクラスとしてやり取りするのがいいかと思います。 MyData.java public class MyData{ public String sDate; public String sName; } TestMap.java public class TestMap { public static MyData method(String syainNo){ MyData myData = null; try{ TestMap testMap = new TestMap(); testMap.setMap("test.csv"); //Keyに対応する出力の判断 if( testMap.checkKey(syainNo) ){ myData = (MyData) hashMap.get(syainNo); } else{ System.out.println("対応するKeyが存在しません。"); } }catch(Exception e){ System.out.println( e.getMessage() ); } return myData; } jukou.java /* LOOKUP用処理 */ else if (req.getParameter("map") != null) { MyData x; x = TestMap.method(strings);
補足
tyoufuさん、こんにちは。 ご返事有り難うございました。 まだちゃんとは動いていませんが、とても参考になりました。もしかしましたら、月曜にまた質問させて頂くかも知れませんがご教授して頂けたら幸いです。
- aloop
- ベストアンサー率23% (10/43)
#1です。 TestMap.javaについて・・・ ------------------------------------------------ >//Keyに対応する出力の判断 >if( testMap.checkKey( syainNo[] ) ){ ------------------------------------------------ この部分。 checkKey()の引数にString配列を指定したいようですが、 配列を受け取るようになっていませんよね。 ------------------------------------------------ >/*セットされたキーがあるか判定*/ >public boolean checkKey(String key){ ------------------------------------------------ これの解決とその他もろもろを含め、TestMap.java以下のように書き換えてみました。 ------------------------------------------------ import java.io.*; import java.util.*; public class TestMap { private static HashMap hashMap = new HashMap(); class MyData{ public String sDate; public String sName; } public static void method(String syainNo){ try{ TestMap testMap = new TestMap(); testMap.setMap("test.csv"); //Keyに対応する出力の判断 if( testMap.checkKey(syainNo) ){ MyData myData = (MyData) hashMap.get(syainNo); //jukou myData2 = new jukou(myData); //myData2の使用目的が不明 } else{ System.out.println("対応するKeyが存在しません。"); } }catch(Exception e){ System.out.println( e.getMessage() ); } } /*HashMapにKey and Valueをセット*/ public void setMap(String sFileName) throws Exception{ FileReader oFileReader = new FileReader( sFileName ); BufferedReader oBufferedReader = new BufferedReader( oFileReader ); String sLineData; String Key; MyData oMyData = null;//new MyData(); while((sLineData = oBufferedReader.readLine()) != null) { StringTokenizer oStringTokenizer = new StringTokenizer(sLineData, ","); Key = oStringTokenizer.nextToken(); oMyData = new MyData(); oMyData.sDate = oStringTokenizer.nextToken(); oMyData.sName = oStringTokenizer.nextToken(); hashMap.put(Key,oMyData); oMyData = null; } } /*セットされたキーがあるか判定*/ public boolean checkKey(String key){ boolean boolKey = false; boolKey = hashMap.containsKey(key); return boolKey; } }
補足
こんにちは。 詳しく説明いただきましてありがとうございます☆ お陰様でTestMap.javaのエラーは無くなりました。 ちょっと質問したいんですが、 //jukou myData2 = new jukou(myData); //myData2の使用目的が不明 がないと、TestMap.javaからjukou.javaに戻れないような気がするんですが、その辺はどうなんでしょうか? ご教授して頂けたら幸いです。
- chi-kon
- ベストアンサー率43% (58/132)
public jukou(){ String sDate; String sName; } だけではなくて public jukou(クラス名 仮引数){ String sDate; String sName; } というコンストラクタを定義していますか? という意味ですよ。 でないと jukou myData2 = new jukou(myData) ; はコンパイルとおりません。
補足
こんにちは。 詳しく説明いただきましてありがとうございます☆ >public jukou(クラス名 仮引数){ の、どうしてクラス名が入るのか分からないんですが、以下のように修正してみました。 public class jukou extends HttpServlet { public jukou(TestMap(),"C") { String sDate; String sName; } public void init(ServletConfig con) throws ServletException { super.init(con) ; } 以下のようなエラーが表示されました。 jukou.java:11: <identifier> がありません。 public jukou(TestMap(),"C") ^ jukou.java:11: メソッド本体がないか、abstract として宣言されています。 public jukou(TestMap(),"C") chi-konさんの意図を理解していないと思うんですが、 すいませんが、 ご教授して頂けたら幸いです。
- chi-kon
- ベストアンサー率43% (58/132)
こんにちは。 一連の質問も拝見しましたが、 #01の方がいうとおりだとおもいます。 仕事で切羽詰っているなどというのであれば あんまりお勧めできないのですが JavaIDEを利用してください。 とくにEclipseなどがいいと思います。 リアルタイムにコンパイルエラーを検知してくれますので。 J2EE開発をするのであればせめて基本的なJ2SEレベルは抑えておかないと知識がジェンカ(積み木のゲームのあれです。)になってしまい、すごーいシステムになってしまいますよ? せめて基礎文法だけは抑えてから出ないと。。。 ちなみに #02の方がおっしゃるとおり jukou.java:206: シンボルを解決できません。 は変数の定義がしていない場合にでるのが主です。 またはタイプミス(大文字小文字とか)などです。 基本的なコンパイルエラーは自分でとれるようにがんばってください。
お礼
こんにちは。 詳しく説明いただきましてありがとうございます☆ >せめて基礎文法だけは抑えてから出ないと。。。 そうですよね。本を読んで理解しているつもりなんですが、実際作成すると、???になってしまうんです。 >基本的なコンパイルエラーは自分でとれるようにがんばってください。 そうですよね。 ご迷惑をお掛けしましてすいません。
- tyoufu
- ベストアンサー率28% (19/67)
色々な事をやろうとして、混乱されているように思います。 まずは、TestMapクラスを呼び出す事をしないで jukouサーブレットが実行出来るか確認された方がいいと思います。 jukou x; x = TestMap.method(strings) ; この部分を一度コメントにして実行されてみてはいかがでしょうか? あと、エラーメッセージから判断できることとして ----------------------------------------------- jukou.java:205: シンボルを解決できません。 シンボル: 変数 pw 場所 : jukou の クラス pw.println("<html><head>") ; ^ ----------------------------------------------- #1の方も言ってらっしゃる通り、これは pw が宣言されていないからです。 jukou.javaの 205行目より上で pw は宣言されていますか? また、初期化されていますか? ----------------------------------------------- jukou.java:95: 互換性のない型 検出値 : void 期待値 : jukou x = TestMap.method(strings) ; ^ ----------------------------------------------- これはエラーメッセージの通りです。 質問者さんは TestMap.method(strings) って呼び出したときの戻り値に jukouクラスを希望されていますが、実際は TestMap.method(strings)の戻り値は void(戻り値なし)となっているようです。 ソースは 出来るだけ多く載せられるほうがいいと思います。 特に TestMap.method(strings)は載せた方がいいですね。 今回のように、端折られすぎると他の方々も回答の出来ないと思います。
補足
こんにちは。 訳の分からない質問なのに、ご返事有り難うございました。 >特に TestMap.method(strings)は載せた方がいいですね。 >今回のように、端折られすぎると他の方々も回答の出来ないと思います。 そうですよね。 文字制限があるみたいで、ついつい省いてしまいました。これがTestMap.method(strings)です。 public class TestMap { /*HashMap生成(クラス変数)*/ class MyData{ public String sDate; public String sName; } private static HashMap hashMap = new HashMap(); /*追加:入力キー(クラス変数)*/ public static String inputKey = null; private String[] keys = {}; public static void method(String SYAINNO[]){ try{ TestMap testMap = new TestMap(); testMap.setMap("test.csv"); /*Keyに対応する出力の判断*/ if(testMap.checkKey(SYAINNO[])){ MyData myData = (MyData) hashMap.get(inputKey); //System.out.println("日付:" + myData.sDate + " 名前:" + myData.sName); jukou myData2 = new jukou(myData) ; } else{ System.out.println("対応するKeyが存在しません。"); } }catch(Exception e){} } /*HashMapにKey and Valueをセット*/ public void setMap(String sFileName) throws Exception{ FileReader oFileReader = new FileReader(sFileName); BufferedReader oBufferedReader = new BufferedReader(oFileReader); String sLineData; String Key; MyData oMyData = null;//new MyData(); while((sLineData = oBufferedReader.readLine()) != null) { StringTokenizer oStringTokenizer = new StringTokenizer(sLineData, ","); Key = oStringTokenizer.nextToken(); oMyData = new MyData(); oMyData.sDate = oStringTokenizer.nextToken(); oMyData.sName = oStringTokenizer.nextToken(); hashMap.put(Key,oMyData); oMyData = null; } } /*HashMap.put(Object,Object)でセット*/ /*セットされたキーがあるか判定*/ public boolean checkKey(String key){ boolean boolKey = true; boolKey = hashMap.containsKey(key); /*クラス変数のinpuKeyに判定結果によってセットするかどうか*/ if(boolKey){ inputKey = key; } else{ inputKey = null; } return boolKey; } } ご教授して頂けたら幸いです。
- aloop
- ベストアンサー率23% (10/43)
こんにちは。 >jukou.java:95: 互換性のない型 >検出値 : void >期待値 : jukou >x = TestMap.method(strings) ; jukouクラスのコンストラクタ"jukou()"はMydataクラスを引数としていますか? --------------------------------------- ・TestMap.java jukou myData2 = new jukou(myData) ; ・jukou.java public jukou(){ String sDate; String sName; } ---------------------------------------- >jukou.java:205: シンボルを解決できません。 >シンボル: 変数 pw >場所 : jukou の クラス >pw.println("<html><head>") ; 変数 pw はjukouクラス内に宣言されていますか? また、クラス内のどこに宣言されていますか? 変数 pw (恐らくクラスのインスタンス)にメソッドprintln()は存在しますか? どうやらあなたはJavaを根本的に理解していないようです。 もっと簡単な例題からはじめてみてはいかがでしょうか?
お礼
こんにちは。 ご返事有り難うございました。 ----------- >jukouクラスのコンストラクタ"jukou()"はMydataクラスを引数としていますか? Mydataは、TestMap.javaでHashMapとして以下のように定義していて、 oMyData = new MyData(); oMyData.sDate = oStringTokenizer.nextToken(); oMyData.sName = oStringTokenizer.nextToken(); 以下のように画面に表示させたときにはエラーはありませんでした。 System.out.println("日付:" + myData.sDate + " 名前:" + myData.sName); ------------- それでjukou.javaで以下のように定義してあります。 public jukou(){ String sDate; String sName; ------------ 変数 pw はjukouクラス内に宣言されていますか? PrintWriter pw = res.getWriter() ; と、定義してあります。 >jukou.java:205: シンボルを解決できません。 >シンボル: 変数 pw >場所 : jukou の クラス >pw.println("<html><head>") ; これと似たエラーが出るんですが、 jukou.javaのコンストラクタを消せば、 ------ public jukou(){ String sDate; String sName; } ------ これらのエラーは消えます。 jukou.javaのコンストラクタの書き方にあると思うんですが、ご教授して頂けたら幸いです。
補足
aloopさん、一つ一つがとても良く理解できました。 分かっていたつもりなんですが、理解不足だったようです。以下が、jukou.javaです。(文字制限の関係で全部はコピペできませんでした) /* ここからIOServlet.java */ import java.io.* ; import java.util.* ; import javax.servlet.* ; import javax.servlet.http.* ; //import TestMap; public class jukou extends HttpServlet { jukou(TestMap(),"C") { String sDate; String sName; } public void init(ServletConfig con) throws ServletException { super.init(con) ; } public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html; charset=shift_jis") ; PrintWriter pw = res.getWriter() ; String HOUKOKUYY = req.getParameter("HOUKOKUYY") ; String HOUKOKUMM = req.getParameter("HOUKOKUMM") ; .... HOUKOKUYY = decodeString(HOUKOKUYY) ; HOUKOKUMM = decodeString(HOUKOKUMM) ; .... /* 入力ボタン用処理 */ if (req.getParameter("input") != null) { doInput(pw, HOUKOKUYY, HOUKOKUMM, HOUKOKUDD, SYOZOKUNO, SYAINNO, SHIMEI, KOUZANO, KOUZAMEI, KENSYUYY, KENSYUMM, KENSYUDD, SOUGOU, POINT1, POINT2, POINT3, POINT4, POINT5, POINT6, POINT7, POINT8, MOKUTEKI, SEIKA, KOREKARA, SAIKOU, SAITEI) ; } /* 出力ボタン用処理 */ else if (req.getParameter("output") != null) { doOutput(pw, SYAINNO) ; } /* LOOKUP用処理 */ else if (req.getParameter("map") != null) { MyData x; x = TestMap.method(strings); } pw.close() ; } /* 文字化け用処理 */ private String decodeString(String text) { try { return new String(text.getBytes("8859_1"), "JISAutoDetect") ; } catch (Exception e) { System.out.println("error!") ; return null ; } } /* 入力ボタン用処理 */ public void doInput(PrintWriter pw, String HOUKOKUYY, String HOUKOKUMM, String HOUKOKUDD, String SYOZOKUNO,String SYAINNO, String SHIMEI, String KOUZANO, String KOUZAMEI, String KENSYUYY, String KENSYUMM, String KENSYUDD, String SOUGOU,String POINT1, String POINT2, String POINT3, String POINT4, String POINT5, String POINT6, String POINT7, String POINT8,String MOKUTEKI, String SEIKA, String KOREKARA, String SAIKOU, String SAITEI) throws IOException { try { FileWriter fw = new FileWriter("C:\\ja\\" + SYAINNO + ".txt") ; fw.write(HOUKOKUYY + ",") ; fw.write(HOUKOKUMM + ",") ; .... fw.close() ; pw.println("<html><head>") ; pw.println("<title>送信</title>") ; pw.println("</head><body><center>") ; pw.println("送信しました。<br>") ; pw.println("<a href=../jukou.htm>戻る</a>") ; pw.println("</center></body></html>") ; pw.close() ; } catch (Exception e) { } finally { } } /* 出力ボタン用処理 */ public void doOutput(PrintWriter pw, String SYAINNO) throws IOException { ..... } }