• ベストアンサー

nullについて

public class Test0 { public static void main(String[] args) { String str="x"; str=null; if(((Object)str).equals(null)) { System.out.println("ok"); } else { System.out.println("out"); } } } を実行するとエラーになります str=null; をコメントアウトするとエラーでなくなります クラスオブジェクトがnullに等しいかどうか をするときにたとえそのオブジェクトがnullであっても エラーにならないようにするにはどうしたらいいのでしょうか? (tryは使用しない方法でおねがいします) また String x; とした直後にxはnullなのでしょうか? String以外に一般のクラスについてもお願いします

  • guuman
  • お礼率86% (1043/1206)
  • Java
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

public class Test { public static void main(String[] args) { String str = ""; if( str == null ) { System.out.println("ok"); } else { System.out.println("out"); } } } nullかどうかのチェックはstr == nullでチェックしてください。 str = nullとすると、参照する実体が無いわけですからメソッドの呼び出しに失敗します。 >String x; >とした直後にxはnullなのでしょうか? 私の環境(build 1.5.0_06-b05)で試そうとしましたが String str; if( str == null )は 「変数 str は初期化されていない可能性があります。」 というコンパイルエラーになりました。

guuman
質問者

お礼

ありがとうございます やってみました public class Test0 { public static void main(String[] args) { String str="x"; str=null; if(str=null) { System.out.println("ok"); } else { System.out.println("out"); } } } の結果はok public class Test0 { public static void main(String[] args) { String str="x"; //str=null; if(str=null) { System.out.println("ok"); } else { System.out.println("out"); } } } の結果はoutです つまり String str; の直後strはnullではないのですね String str; str=null; としてはじめてstrはnullになるようです たぶん任意のクラスオブジェクトでもそうでしょうね

guuman
質問者

補足

ありがとうございます 今は出勤前会社で確認してみます str = null; 駄目だということですが これはガーベッジコレクションを呼ぶために使えるのではないでしょうか? よろしくお願いします

その他の回答 (3)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.4

まず、オブジェクトがnullでも使える比較は例えば次のようにします。 if (str==null || str.equals("")) { // strがnullあるいは""のとき } else { // それ以外 } > String x; > とした直後にxはnullなのでしょうか? Javaでは宣言だけして初期化していない場合は値がないとされ、代入前に参照するとコンパイルエラーとなります。 実行時にどの分岐パスを通っても参照前に確実に初期化されることがコンパイラに分かるようなコードを書かなければいけません。 > str = null; > 駄目だということですが > これはガーベッジコレクションを呼ぶために使えるのではないでしょうか? それ以上参照しない変数にnullを代入するのは確かにガーベージコレクタにオブジェクトが不要になったことを伝える一つの手段ではあります。ただ即座にガーベージコレクションが実行されるわけではないので誤解のないように。

guuman
質問者

お礼

ありがとうございます

  • tom11
  • ベストアンサー率53% (134/251)
回答No.3

こんにちは、 外しているかもしれませんが、 String で、null と "" は、使い分けないといけないみたいです。 String sample = "x"; if ((sample == null) || (sample.equals(""))) { System.out.println("空白"); }else{ System.out.println(sample); } sampleにnull 又は ""の時、空白を出力します。 sample.equals(null)は、駄目なようです。

guuman
質問者

お礼

ありがとうございます

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

比較はif(str=null)ではありません。if(str==null)です。 str=nullは代入を表し必ず真になります。(つまりelse部分は実行されません。) >これはガーベッジコレクションを呼ぶために使えるのではないでしょうか? 基本的にガベージコレクションというのは オブジェクト毎に参照数をみて廃棄するかどうかというのをみると思いますが nullとする事で参照カウンタがデクリメントされるかどうかは知りません。 もしJavaでのメモリーリークを 心配しての補足要求なら別途「弱参照」で調べてみると良いでしょう。 http://www-06.ibm.com/jp/developerworks/java/051209/j_j-jtp11225.shtml

guuman
質問者

お礼

ありがとうございます if(str=null)はif(str==null)の写し間違いでした 実際にはif(str==null)でやっていました

関連するQ&A

  • 以下のコードのどこが問題なのでしょうか?

    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
  • シンボルを解決できません・・・?

    Java初心者です。 public class mondai5 { public static void main(String args[]) { String str = "abc"; if( str != null && str.index0f('a') != -1) { System.out.println("OK"); } else { System.out.println("BAD"); } } } これをコンパイルをしようとすると、このような表示が出ます。 シンボルを解決できません。 シンボル:メソッドindexOf(char) 場所:java.long.Stringのクラス   if( str != null && str.indexof('a') != -1)              ^ なにをしたらいいのかわかりません。 教えてください。

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

    現在JAVAについて学んでいるのですが、下記のソースが実行出来ません。どなたかわかる方、回答宜しくお願いいたします。 public class Lound { void main(String[] args) { String rtn = methWithParamReturn(3); if(rtn.equals("0")) System.out.println("0あかんよ"); else System.out.println(rtn); } public String methWithParamReturn(int x) { System.out.println(x); x= x*x; String str = String.valueOf(x); return str; } }

  • Javaの参照渡し

    以下のようなプログラムで望むような結果(下に書いてある実行結果)は得られるでしょうか。 class HelloWorld {   public static void main(String[] args)   {     String str;     makeString1(str);     System.out.println(str);     makeString2(str);     System.out.println(str);   }   public static void makeString1(String str)   {     String words = "HelloWorld!";     str = words;   }   public static void makeString2(String str)   {     str = "HelloWorld!!";   } } ---実行結果--- HelloWorld! HelloWorld!!

    • ベストアンサー
    • Java
  • 文字の表示

    オブジェクトを受け取るメソッド ↓は引数にString型のオブジェクトを指定するプログラムです public class Sample { public static void main(String args[]) { String str = "abcd"; change(str); System.out.println(str); } private static void change(String str) { str = "efgh"; } } 私の中ではefghがでると思っていたんですが・・ これを実行してみると変数strに最初に代入した文字列が表示されるんです! なぜですか? できれば理由を教えてください 回答よろしくお願いします

  • コマンドライン引数

    『やさしいJava』で勉強してます。 import java.io.*; class Sam3 { public static void main(String args[]) { if(args.length != 1){ System.out.println("ファイル名が違うよ。"); System.exit(0); } try{ BufferedReader br= new BufferedReader(new FileReader(args[0])); String str; while((str = br.readLine()) != null){ System.out.println(str); } br.close(); }catch(IOException e){ System.out.println("エラー"); } } } で、コンパイルして、 Sam3 test2.txt と実行しても 「準備ができていません。読み取り中・・・」 としかでません。 なにか間違いがあるのでしょうか? お願いします。

    • ベストアンサー
    • Java
  • プログラムの組み合わせ方

    java初心者です。 2つのプログラムを組み合わせて1つのプログラムにしたいんですが、イマイチ分かりません。 このプログラムと、 import java.io.*; class Hello2 {  public static void main(String[] args) throws IOException {   System.out.println("名前を入力してください");   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   String str = br.readLine();   System.out.println(str + "さん、こんにちは!");  } } このプログラムを、 import java.io.*; class Sanbai{  public static void main(String[] args) throws IOException {   System.out.println("好きな数を入力してください");   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   String str = br.readLine();   int x;   x = Integer.parseInt(str);   System.out.println("あなたの入力した数:" + x);   System.out.println("その3倍の数:" + (x*3));  } } 組み合わせて1つのプログラムにするにはどうしたらいいですか?(>_<)

    • ベストアンサー
    • Java
  • メインメソッドの記述について

    メインメソッドを記述する際に、   public static void main(String[] args){     ~~~~~~~~~~~~~   } と書くと思いますが、なぜpublicを付けなければならないのでしょうか? 簡単に考えるために、1つのクラスのみで実行してみたのですがやはりpublicをつけないとエラーになってしまします。 1つのクラスしかないので、どこからも参照されないからpublicでなくても良いと思ったのですが・・・ ちなみに以下の様なとても簡単なもので考えました。 class E_1{ static void main(String[] args){ System.out.println("実験です"); } }

  • Javaについて教えてください!

    OyaクラスのメインメソッドからKoクラス内のメソッドを呼び出して文字列の出力を行いたいのですが、今のままではエラーが出てコンパイル出来ません。どこが間違っているか教えてください!ちなみにエクリプスでの実行には問題はありません。 public class Ko{ public static void ko(){ String str = "KO"; System.out.println(str); }} public class Oya{ public static void main(String[] args){ Ko.ko(); }}

    • ベストアンサー
    • Java
  • javaの質問です 合ってるかをお願いします

    間違ってる場合は何が正解かを教えてください。 よろしくお願いします 1 変数strには何が入っているか test 2 dataとstrの関係 わからないです。 public class Example5 { public static void main( String[] args ) { String data = "test."; hyouji( data ); } static void hyouji( String str ) { System.out.println( str ); } }

    • ベストアンサー
    • Java