- PR -

nullと表示される

1
投稿者投稿内容
ほこ
会議室デビュー日: 2003/12/17
投稿数: 10
投稿日時: 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/05/21
投稿数: 70
投稿日時: 2004-07-24 17:33
こんにちは。

ソースを見る限り確実にnullが挿入されるようになってますね。
コンストラクタでDBに挿入しているようですがcarnameは初期化されていません。
このソースを見る限り、コンストラクタの使用方法がよくわかっていないように思えます。

>Javaの勉強中でWebDBプログラミングでつまづいております。
おせっかいと思われるかもしれませんが、WebやDBプログラミングを始める前に、
きっちりとJavaの基礎を学んだ方がいいのではないでしょうか?
ほこ
会議室デビュー日: 2003/12/17
投稿数: 10
投稿日時: 2004-07-24 17:49
返信ありがとうございます。

確かに基礎がしっかりしていなまま「何となく」という理解で今まで進んできたような気がします。

もう一度、基礎に立ち戻り勉強してみます!!

また、質問が出た際は宜しくお願いします。
harumaki
常連さん
会議室デビュー日: 2004/09/09
投稿数: 32
投稿日時: 2004-09-12 22:12
ところで、こういったケースでは
なぜ"null" が表示されたり、"null" が設定されるのでしょうか?

NullPointerException が発生するのではないのでしょうか?
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-09-12 23:02
ケン・アーノルド他著による『プログラミング言語 Java 第3版』
ピアソン・エデュケーションを引用すれば、

6.8.5 文字列変換
『null参照が Stringに変換される場合には、結果は文字列 "null"
となります。null参照は文字列結合式の中で使用できます。』

6.9 メンバーアクセス
『値が nullの参照に対して、.を使用すると、staticメンバーへの
アクセスでなければ、NullPointerExceptionになります。』

とあります。
さく
会議室デビュー日: 2004/09/01
投稿数: 13
投稿日時: 2004-09-12 23:08
引用:

harumakiさんの書き込み (2004-09-12 22:12) より:
ところで、こういったケースでは
なぜ"null" が表示されたり、"null" が設定されるのでしょうか?

NullPointerException が発生するのではないのでしょうか?



SQL文の作成に文字列の+演算子による連結を使っていますね。
ここでは内部的にはStringBufferとappendメソッドが使われていま
す。StringBuffer#append(Object o)は、String.valueOf(o)の結果
を連結します。でもって、String.valueOf(Object o)は、引数が
nullだと"null"という文字列を返すという仕様になっています。

あと、SQL文は、文字列の連結で作るよりもPreparedStatement
を使ったほうがいいですね。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-09-12 23:16
unibon です。こんにちわ。

引用:

harumakiさんの書き込み (2004-09-12 22:12) より:
ところで、こういったケースでは
なぜ"null" が表示されたり、"null" が設定されるのでしょうか?

NullPointerException が発生するのではないのでしょうか?


デバッガーで追いかけて行っても分かるのですが、
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/String.html#valueOf(java.lang.Object)
の仕様により、文字列 "null" になることが決まっているようです。
私も NullPointerException にしてほしいです。
harumaki
常連さん
会議室デビュー日: 2004/09/09
投稿数: 32
投稿日時: 2004-09-13 00:20
こん○○わ。harumaki です。

なるほど、皆様的確なご回答ありがとうございます。
納得がいきました。

が、ほんとNullPointerException にして欲しい。。。

#きっと何かの規約や法則、利便性やら考えられてるんでしょうね。うーん。
1

スキルアップ/キャリアアップ(JOB@IT)