質問

畏れ入ります。

X番目の文字を調べたいとき
strにStringbufferで文字列が入っていた場合

if(str.charAt != "")

とすることができません。
互換性のない型、と出てしまいます。
また、""を’’
とすると、「空の文字リテラルです」
と出てしまいます。
charが空であることを調べるのにはどうすればいいですか?

通報する

回答 (4件)

> おっしゃるとおり'a'と言う書き方はできたのですが、
> ''(空)はできないのかな?? と疑問に思いまして・・・

なるほど。
結論から書きますと、(先ほども少し書きましたが)「空の文字」というのは存在しないんです。
このことについて、もう少し説明しますね。

「文字」そのものに関して説明する前に、「文字列」について少し説明したいと思います。
文字列というのは、「文字」がいくつか つながって出来たものなんです。例えば、
"ABDCE"
という文字列があったら、
'A' 'B' 'C' 'D' 'E'
という5個の文字がつながっていると考えてください。つまり、この文字列に関して言えば、
最初の文字は 'A'、次の文字は 'B'、その次は 'C'……
というようになります。
では、最後の 'E' の後はどうなっているのかというのが気になりますが、実はここには何も存在しないんです。つまり、「空の文字」が存在しているわけではなくて、「文字」そのものが存在していないんです。
だから、'E' の次にある文字を取り出したら「空の文字」になった、というようなことはありえないというわけなんです。

ただし、「空の文字列」や「空の文字列バッファ」はありえるのです。(ここが、ちょっとややこしい)
これは、文字列(バッファ)の中に文字が一つも存在していないと考えてください。
先ほどの "ABCDE" という文字列は、5個の文字からできていました。つまり、文字列という枠の中に5個の文字が存在していたわけです。
しかし、空の文字列には文字はありません。文字列という枠の中に文字が一つも入っていないということです。(ただし、文字列という枠そのものは存在しています)

空の文字列は、ダブルクォーテーションマークを二つ続けて "" というように書きます。ダブルクォーテーションマークという枠は存在していますが、その中には何もないわけです。

では、なぜ「空の文字」は存在しないのか。実は、「文字」は「文字列」とはまったく異なった性質を持っているのです。

一つ段ボール箱(=文字列)があったとします。箱の中には、いろんな色のボール(=文字)が入っています。
もし箱の中にボールが一つもなかったら、それは空の文字列です。箱の中にボールが3個入っていれば、それは長さが3の文字列です。
では、箱の中から一つボールを取り出して、そのボールの色を見て見ましょう。
「青」「赤」「緑」「黒」「白」などといろいろ考えられますが、ボールの色が文字の中身を表わしていると考えてください。ボールが赤色だったら、それは '赤' という文字です。

では、もし「空の文字」という文字があるならば、何色でしょうか? 「白」「黒」「無色透明」などが「空の文字」に相当するように思えるかもしれませんが、ちょっと待ってください。
'白'、'黒'、'無' という色が、確かに存在しています。ということは、これは「空の文字」ではありません。
そもそも、ボールという物体が存在していれば、そのボールには何かしら色があるわけで、ボールに色が「無い」ということはありえませんね。
同じように、文字が「空」になることも無いんです。

一つの文字が存在しているとき、その文字は何があろうと「一つの文字」なんです。


さて、
> length()以上の数をcharAtの引数に入れたら例外が出そうですね・・・
とおっしゃっているのは、まさにそのとおりなのです。
文字が存在しないことを知らせるために、例外をスローするわけです。(「空の文字」を返す、ということができないからですね)

もちろん、charAt を使う前に引数の値を length とチェックしておくという対策もOKですが、例外をキャッチするという手もあります。
例外を、引数が範囲外になったことの合図としてとらえるわけです。

(結構細かな話をしたので、今回はわかってもらえる自信なしです)

この回答へのお礼

大変感謝します。

すごくわかりやすかったです。

文字列と文字との違い、ですね(*^_^*)

こういったことはなかなかうまく説明している本はなかったりするので大変ためになりました。

ありがとうございました_(._.)_

#1 です。

> 何がしたかったかと言うと、
> abcdefghijk~
> のような文字列があって
> その1文字ずつをしらべていって

よくわかんないけど、特定の文字もしくは
文字列が含まれているかどうか確認するなら
indexOf メソッドってのもありますんで、蛇足ですが。

この回答へのお礼

indexOfがありましたね~

調べてみました。

回りくどいことをやっていたようです。

ありがとうございました

まず、Javaにおいて「文字(char)」と「文字列(String)」と「文字列バッファ(StringBuffer)」はすべて異なるものとして扱われますので、注意してください。

例えば、「if(str.charAt != "")」のように書くと、「文字」と「文字列」を比較することになるので、エラーになります。

「文字」は、必ず一つのUnicode文字を表わします。
「文字」同士が同じかどうかを比較するには、==を使います。

「文字列」同士を比較するには、equals というメソッドを使います。== を使って比較することはできません。equals は文字列の「内容」が同じであるか比較するのに対し、== は二つの文字列変数に代入された「インスタンス」が同じであるかを比較するだけです。

「文字列バッファ」についても、比較の仕方は文字列と同じです。

さて、ご質問の件ですが、「空の文字(char)」というものは存在しません。char は、必ず一つのUnicode文字を表わします。
(ただし、「空白」などのUnicode文字を代入することはできます。)

代わりに、「0文字の文字列」とか「0文字の文字列バッファ」は存在します。
文字列や文字列バッファの文字数を調べるには、それらの length メソッドを使います。

なお、charAt メソッドは、文字列あるいは文字列バッファの何文字目かにある文字を取得するものです。
このメソッドでは、文字列(バッファ)の文字数を超える範囲の部分の文字を取得しようとすると、例外が発生します。例えば、文字数が3の文字列に対して charAt(10) を行うと、例外になります。

なお、文字列(バッファ)の文字数は、「長さ」とも呼ばれます。


String 型の変数 str に代入された文字列の長さが3以下であるか調べる例
if (str.length() <= 3) .....

String 型の変数 str に代入された文字列の前から3文字目が 'A' という文字であるか調べる例
if (str.charAt(2) == 'A') .......

二つ目の例でcharAtメソッドを用いていますが、前から3文字目の文字を取り出すのに2という引数を指定している点に注意してください。「前から何文字目」を表わす数字は、このように一つずれるようになっています。
もちろん、この例では、文字列の長さが3文字以上であることが前提です。文字列の長さが3未満である場合、つまり、文字列に3文字目が存在しない場合、例外がスローされます。


これまで私が書いてきたことは、とても重要なことです。過去にも他の方が似たような質問をしているので、過去の投稿履歴を検索してみるのも良いでしょう。
何か分からないことがあったら、おっくうがらずに補足して下さい。

この回答への補足

いろいろありがとうございます。

おっしゃるとおり'a'と言う書き方はできたのですが、
''(空)はできないのかな??
と疑問に思いまして・・・

まだまだ勉強不足ですね・・・

>charが空であることを調べるのにはどうすればいいですか?

空って空白(space)ではないの?

Stringbufferのlengthメソッドで
文字数取得するのでは、ダメなんでしょうか。

この回答への補足

実はlength()で代用しました。

何がしたかったかと言うと、
abcdefghijk~

のような文字列があって
その1文字ずつをしらべていって
その文字が””(空)であれば処理終わり、
としようと思ったのですが・・・
よく考えたら、length()以上の数をcharAtの引数に入れたら例外が出そうですね・・・

このQ&Aは役に立ちましたか?1 件

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

新しく質問する

注目の記事


新しく質問する

このカテゴリの人気Q&Aランキング

毎日見よう!教えて!gooトゥディ

べんりQ&A特集