- - PR -
nullと表示される
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-07-24 17:19
はじめまして、ほこと申します。
Javaの勉強中でWebDBプログラミングでつまづいております。 【環境】 ・j2sdk1.4.2_04 ・jakarta-tomcat-3.2.3 ・MS-Access2000 【問題点】 nullで表示される。 変数carnameに文字列“カローラ”を直接指定して実行するとDBにINSERTされずnullと表示される。 String qry1 = "INSERT INTO 車表 VALUES (100, ’カローラ’)";とするときちんと“カローラ”とDB上に表示される。 ※最終的にはWeb画面上のTextboxで入力した値をDBにINSERTするプログラムを作成したいと思っていましたのでsetCarnameの引数cnはそのTextboxの値を受ける引数です。 よろしくお願い致します。 【ソース】 import java.util.*; import java.io.*; import java.sql.*; public class CarDBBean implements Serializable { private Vector colname; private Vector data; private String carname; public void setCarname(String cn) { carname = "カローラ"; } public CarDBBean() { try{ String drv = "sun.jdbc.odbc.JdbcOdbcDriver"; String url = "jdbc:odbc:CarDB"; String usr = ""; String pw = ""; Class.forName(drv); Connection cn = DriverManager.getConnection(url, usr, pw); Statement st = cn.createStatement(); String qry1 = "INSERT INTO 車表 VALUES (100, '" + carname + "')"; String qry2 = "SELECT * FROM 車表"; st.executeUpdate(qry1); ResultSet rs = st.executeQuery(qry2); 以下省略 | ||||
|
投稿日時: 2004-07-24 17:33
こんにちは。
ソースを見る限り確実にnullが挿入されるようになってますね。 コンストラクタでDBに挿入しているようですがcarnameは初期化されていません。 このソースを見る限り、コンストラクタの使用方法がよくわかっていないように思えます。 >Javaの勉強中でWebDBプログラミングでつまづいております。 おせっかいと思われるかもしれませんが、WebやDBプログラミングを始める前に、 きっちりとJavaの基礎を学んだ方がいいのではないでしょうか? | ||||
|
投稿日時: 2004-07-24 17:49
返信ありがとうございます。
確かに基礎がしっかりしていなまま「何となく」という理解で今まで進んできたような気がします。 もう一度、基礎に立ち戻り勉強してみます!! また、質問が出た際は宜しくお願いします。 | ||||
|
投稿日時: 2004-09-12 22:12
ところで、こういったケースでは
なぜ"null" が表示されたり、"null" が設定されるのでしょうか? NullPointerException が発生するのではないのでしょうか? | ||||
|
投稿日時: 2004-09-12 23:02
ケン・アーノルド他著による『プログラミング言語 Java 第3版』
ピアソン・エデュケーションを引用すれば、 6.8.5 文字列変換 『null参照が Stringに変換される場合には、結果は文字列 "null" となります。null参照は文字列結合式の中で使用できます。』 6.9 メンバーアクセス 『値が nullの参照に対して、.を使用すると、staticメンバーへの アクセスでなければ、NullPointerExceptionになります。』 とあります。 | ||||
|
投稿日時: 2004-09-12 23:08
SQL文の作成に文字列の+演算子による連結を使っていますね。 ここでは内部的にはStringBufferとappendメソッドが使われていま す。StringBuffer#append(Object o)は、String.valueOf(o)の結果 を連結します。でもって、String.valueOf(Object o)は、引数が nullだと"null"という文字列を返すという仕様になっています。 あと、SQL文は、文字列の連結で作るよりもPreparedStatement を使ったほうがいいですね。 | ||||
|
投稿日時: 2004-09-12 23:16
unibon です。こんにちわ。
デバッガーで追いかけて行っても分かるのですが、 http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/String.html#valueOf(java.lang.Object) の仕様により、文字列 "null" になることが決まっているようです。 私も NullPointerException にしてほしいです。 | ||||
|
投稿日時: 2004-09-13 00:20
こん○○わ。harumaki です。
なるほど、皆様的確なご回答ありがとうございます。 納得がいきました。 が、ほんとNullPointerException にして欲しい。。。 #きっと何かの規約や法則、利便性やら考えられてるんでしょうね。うーん。 | ||||
1
