String[];
s.length;

これをコンパイルするとコンパイルエラーになりますが、なぜNullPointerExceptionではないのですか?

通常オブジェクトが生成されていないものに対し、メソッド、フィールドの呼び出しを行うとNullPointerExceptionになるはずなのですが…。

配列のlengthがメソッドでもフィールドでもないという事は聞いたことがありますが、これはいったい何なのですか?

このQ&Aに関連する最新のQ&A

A 回答 (4件)

> なぜNullPointerExceptionではないのですか?



を、次のどちらの意味で使ってますか?

(1) このプログラムは コンパイル時に「NullPointerException」というエラーになるはず。
ところで、NullPointerException ではなく別のエラーになってしまう

(2) このプログラムは正常にコンパイルできて、実行時に「NullPointerException」が発生するはず。
ところが、コンパイル自体がエラーでできない。


(1) の場合
NullPointerException は 実行時に発生する例外です。
コンパイル時には発生しません。
// コンパイラのバグ等で、異常事態が発生して.. という可能性は0ではありませんが、そんな特殊な例は無視していいです。


(2)の場合
この例では、文法間違いがあり、正常にコンパイルできません。
それが理解できないのなら、Javaの文法を基礎から勉強しましょう。
    • good
    • 0

そもそも。

変数の宣言がない。初期化がなされていない。

それらを満たした上でなら、NullPointerExceptionになります。
    • good
    • 0

コンパイラにバグがない限り, NullPointerException が「コンパイルエラー」で出ることはそもそもあり得ないんじゃ

ないかなぁ....
    • good
    • 0

>これをコンパイルするとコンパイルエラーになりますが、なぜNullPointerExceptionではないのですか?



その理由はエラーメッセージとして書かれているはずですけど、
エラーメッセージは読まれていますか?

>String[];

これ、何をさせようとしてるのか説明お願いします。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QString a = "a"; と String b = new String ("b"); の違い

String a = "a";
String b = new String ("b");

お伺いしたいのですが、
b は String のインスタンスを作ってると思いますが、
a はどんなことをしてるのでしょうか?

Aベストアンサー

お二人の回答を具体的に言うと、こういうことです。
String a1 = "a";
String a2 = "a";
String b1 = new String ("b");
String b2 = new String ("b");

a1のために、aという文字列のインスタンスが作られますが、
a2に代入されるのは、a1に使われたインスタンスが再利用されます。
これは、
if(a1 == a2) System.out.print("a1と同じインスタンス");
の結果でもわかります。

一方、b1とb2は、bという文字列オブジェクトを引数に、新しいインスタンスを生成する指示がありますので、b1とb2と、その初期化に使った無名のStringインスタンスの3つがメモリ上に存在することになります。
if(b1 != b2) System.out.print("b1とは違うインスタンス");
の結果でもわかると思います。

したがって、
String b = new String ("b"); というのは、Integerに例えると
Integer i = new Integer(new Integer(1)); という処理を
していることになり、ひとつ無駄なインスタンス生成となります。

お二人の回答を具体的に言うと、こういうことです。
String a1 = "a";
String a2 = "a";
String b1 = new String ("b");
String b2 = new String ("b");

a1のために、aという文字列のインスタンスが作られますが、
a2に代入されるのは、a1に使われたインスタンスが再利用されます。
これは、
if(a1 == a2) System.out.print("a1と同じインスタンス");
の結果でもわかります。

一方、b1とb2は、bという文字列オブジェクトを引数に、新しいインスタンスを生成する指示がありますので、b1とb2と、その...続きを読む

QStringクラスのlengthメソッドについて

こんにちは、Stringクラスのlengthメソッドについて質問させてください。

今まで配列のlengthは、宣言時に長さが決定するからメソッドではなく、finalフィールドで十分。
ArrayListだとかは長さが変わるからメソッドという意識を持っていました。
(カプセル化の概念とも関わりますが)

先日その話しをしていたら、「でも文字列(Stringオブジェクト)の長さも不変だよね。」と言われました。
確かに文字列の長さは不変なのに、長さの取得にはメソッドを使っています。

言語仕様として一貫性を持たせるなら、配列もlengthメソッドにするか、文字列をlengthフィールドにしたほうが綺麗だと思うんです。

Stringクラスのソースコードを見ていたら、文字列の長さは内部的に
private int count; と宣言されていました。
そして、lengthメソッドは return count; しているだけでした。

ただ、このcountフィールドに値を代入しているのはコンストラクタ内だけだったので、
public final int length; とすれば、良かったのでは?と思いました。

この考えについて、
それは間違っている、とか歴史的な背景などご存知でしたらご教授ください。

よろしくお願致します。

こんにちは、Stringクラスのlengthメソッドについて質問させてください。

今まで配列のlengthは、宣言時に長さが決定するからメソッドではなく、finalフィールドで十分。
ArrayListだとかは長さが変わるからメソッドという意識を持っていました。
(カプセル化の概念とも関わりますが)

先日その話しをしていたら、「でも文字列(Stringオブジェクト)の長さも不変だよね。」と言われました。
確かに文字列の長さは不変なのに、長さの取得にはメソッドを使っています。

言語仕様として一貫性を持たせるな...続きを読む

Aベストアンサー

あくまで想像ですが・・・

長さを問い合せる場合、括弧付きの「length()」である方がオブジェクト指向
らしい方法と思います。

配列のlenghthは、あくまでフィールドです。
つまり、いくつ配列に格納したか、ではなく、配列として準備した個数を格納
しているにすぎません。

Stringの長さが「不変である」というのは、Stringの性質ではなく、たんに
そういうクラスを作っただけのことなので、結果論からfinalにするのは
設計上正しいとは思えません。
可変のStringクラスだってあってもいいのでは?

Qクラスメソッドのみのクラスのオブジェクト生成は不可??

あるテキストのjavaの問題です。

public class Draw{
  static void pixel(int x,int y){
    /*座標(x、y)に点を描画*/
  }
  static void line(int x1,int y1,int x2,int y2){
    /*座標(x1、y1)~(x2、y2)に線を引く*/
  }
}

で、これを実行するための以下のようなクラス
public class TestDraw{
<ここに入力>
}

という問題なのですが2つまでは絞れたのですが、
(1)
public static void main(String args[]){
  Draw d = new Draw().line(10,10,20,30);
}
↑×
(2)
public static void main(String args[]){
  Draw.line(10,10,20,30);
}
↑○

(2)はlineメソッドがstaticメソッドだからオブジェクト生成しなくても良い、ということなんですが
(1)も正解のような気がするのですが・・・
解説によると「lineはvoidなのでnew Draw().line(10,10,20,30);とすれば正解、とあります。
どうもいまいち理解できません。

クラスメソッドはオブジェクト生成しなくとも良い→オブジェクト生成できない

ということなのでしょうか?

それからちなみに、public classって2つ記述できないんではありませんでしたか?

あるテキストのjavaの問題です。

public class Draw{
  static void pixel(int x,int y){
    /*座標(x、y)に点を描画*/
  }
  static void line(int x1,int y1,int x2,int y2){
    /*座標(x1、y1)~(x2、y2)に線を引く*/
  }
}

で、これを実行するための以下のようなクラス
public class TestDraw{
<ここに入力>
}

という問題なのですが2つまでは絞れたのですが、
(1)
public static void main(String args[]){
  Draw d = new Draw().line(10,10,...続きを読む

Aベストアンサー

> (1)も正解のような気がするのですが・・・
> 解説によると「lineはvoidなのでnew Draw().line(10,10,20,30);とすれば正解、とあります。
> どうもいまいち理解できません。

「Draw d = new Draw().line(10,10,20,30);」はDrawクラスのオブジェクトを生成して
lineメソッドを呼び出し、その戻り値を変数 d に代入しているわけですが、
lineメソッドの戻り値がvoidなのでエラーになります。

「new Draw().line(10,10,20,30);」はDrawクラスのオブジェクトを生成して
lineメソッドを呼び出しているだけなので問題ありません。

> クラスメソッドはオブジェクト生成しなくとも良い→オブジェクト生成できない
> ということなのでしょうか?

オブジェクトが生成できないのではありません。

Draw d = new Draw(); // オブジェクト生成
d.line(10,10,20,30); // lineメソッド呼び出し

> それからちなみに、public classって2つ記述できないんではありませんでしたか?

javaではpublic宣言したクラス名とファイル名は一致していなければならないので、
1つのソースファイルにpublic classを複数記述することはできません。

この問題の場合、Draw.javaとTestDraw.javaに分けて記述します。

> (1)も正解のような気がするのですが・・・
> 解説によると「lineはvoidなのでnew Draw().line(10,10,20,30);とすれば正解、とあります。
> どうもいまいち理解できません。

「Draw d = new Draw().line(10,10,20,30);」はDrawクラスのオブジェクトを生成して
lineメソッドを呼び出し、その戻り値を変数 d に代入しているわけですが、
lineメソッドの戻り値がvoidなのでエラーになります。

「new Draw().line(10,10,20,30);」はDrawクラスのオブジェクトを生成して
lineメソッドを呼び出して...続きを読む

Qdocumentオブジェクトのlengthが取れない

以下のプログラムでobjのlengthが「undefined」となる原因がわからない
<script language="JavaScript"><!--
function Check() {alert("スタート");
var obj = document.frm.elements['check'];
var i,j =0;alert("length="+ obj.length);
for (i = 0; i < obj.length ; i++ ) {
if ( obj[i].checked == true ) {j++;}
}
alert( 'チェックボックスの数='+ i);
alert( 'チェックした数='+ j);
}
//--></script>
<form name="frm" method="POST"><input type="checkbox" name="check" value="1"></form>
<a href="javascript:Check();">チェック</a>

formの中を以下のように変更すると正しく表示される
<form name="frm" method="POST"><input type="checkbox" name="check" value="1"><input type="checkbox" name="check" value="2"></form>
どなたか、ご教授くださいませ。

以下のプログラムでobjのlengthが「undefined」となる原因がわからない
<script language="JavaScript"><!--
function Check() {alert("スタート");
var obj = document.frm.elements['check'];
var i,j =0;alert("length="+ obj.length);
for (i = 0; i < obj.length ; i++ ) {
if ( obj[i].checked == true ) {j++;}
}
alert( 'チェックボックスの数='+ i);
alert( 'チェックした数='+ j);
}
//--></script>
<form name="frm" method="POST"><input type="checkbox" name="check" value="1"></fo...続きを読む

Aベストアンサー

これでどうでしょう。

<script language="JavaScript"><!--
function Check() {alert("スタート");
var i,j=0,len =0;
len= document.frm.elements.length;
alert("length="+len);
for (i = 0; i < len; i++ ) {
if ( document.frm.elements[i].checked == true ) {j++;}
}
alert( 'チェックボックスの数='+ i);
alert( 'チェックした数='+ j);
}
//--></script>

ただ複数のinput要素がfrm内に混在する場合はこの方法は使えません。

QString(byte[] bytes, int offset, int length)の文字コードは?

String(byte[] bytes, int offset, int length)は、バイト配列(8bitずつのまとまり)を、文字列型に直す、というものだと思うのですが文字コードは何にしたがって直すのでしょうか?

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html

Aベストアンサー

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html#String%28byte[],%20int,%20int%29

>プラットフォームのデフォルト文字セットを使用して、

日本語WindowsならShift_JISでしょう。他の環境では解りません。

#なので僕は

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html#String%28byte[],%20int,%20int,%20java.lang.String%29

で指定するほうが好きです。(コードを読む人に,誤解を与えにくく,異なる環境でも挙動を一致させやすいから移植性も高まると考えるため)

どうしてもデフォルトがほしけりゃ
http://java.sun.com/javase/6/docs/api/java/nio/charset/Charset.html#defaultCharset%28%29
があるわけですし

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html#String%28byte[],%20int,%20int%29

>プラットフォームのデフォルト文字セットを使用して、

日本語WindowsならShift_JISでしょう。他の環境では解りません。

#なので僕は

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html#String%28byte[],%20int,%20int,%20java.lang.String%29

で指定するほうが好きです。(コードを読む人に,誤解を与えにくく,異なる環境でも挙動を一致させやすいか...続きを読む


人気Q&Aランキング

おすすめ情報