java初心者です。プログラムが作動してくれません。
エクリプス4.2を使用しています。
下記のエラーが表示されます。
「Exception in thread "main" java.lang.NullPointerException
at chapter12.MyConsole.main(MyConsole.java:7)」
あと、バックスラッシュは「\」でよろしいのでしょうか。
当方win7を使用しています。
よろしくお願い致します。
package chapter12;
import java.io.Console;
class MyConsole
{
public static void main(String[] args) {
Console c = System.console();
String s = c.readLine("%s", "name : ");
char[] cs = c.readPassword("%s", "pass : ");
if(cs.length == 4 && cs[0] == 'w' && cs[1] == 'i'
&& cs[2] == 'l' && cs[3] == 'l');
c.format("Hello, %s\n", s);
}
}
No.2ベストアンサー
- 回答日時:
同じ変数を2回宣言しているのですから、そのようなエラーになるのは当然です。
そこを修正しても、せっかくconsがnullかどうかで処理を分岐しているのに
String s = cons.readLine("%s", "name : ");
が、その分岐の外にあったのでは、結局cons==nullのときでもcons.readLineを実行しようとするので、無意味です。
対策がわからない、とのことですが
System.console() がnullでないなら、 readLineやreadPasswordなどがそのまま使えます。
nullだった場合、なんらかのエラー処理をします。
(プログラム自体を終了させる、とか、別の入力手段を使うとか)
ということです。
次のものは、if文を使った単純な例です。
Console c = System.console();
String s ; // ifのブロック内で宣言すると、そのブロックだけに有効な変数となってしまうため、外で宣言する
char[] cs ;
if ( c != null ) {
// c.readLine等を使う処理
s = c.readLine("%s", "name : ");
cs = c.readPassword("%s", "pass : ");
} else {
// エラー処理
// return ; // プログラムを終了させてしまう例
}
根本的な問題として、Eclipseからの実行では、System.console()がnullを返す、ということです。
別の入力手段を使うか、コマンドプロンプトから直接実行するかになります。
No.1
- 回答日時:
> 「Exception in thread "main" java.lang.NullPointerException at chapter12.MyConsole.main(MyConsole.java:7)」
エラーメッセージの読み方を覚えましょう。
java.lang.NullPointerException という例外が、 chapter12.MyConsole.main の中で発生した(ファイルでは MyConsole.java の 7行目)
という意味です。
まずは、その発生した箇所を「MyConsole.java の 7行目」を見ることから始めます。
java.lang.NullPointerException は、Javaをやってたらとてもよく見る例外です。
nullであて欲しくない箇所でnullになっている場合に発生します。
よくあるのが
・変数を宣言だけして、インスタンスが入っていないまま使おうとしている
・エラー等でnullを返すメソッドを使ったあと、エラーチェック無しにその戻り値を使っている
等です。
7行目とは
String s = c.readLine("%s", "name : ");
この行ですか?そうだとすると、nullになる可能性があるのは、変数cです。
cがnullなら、 nullに対してreadLineメソッドを使おうとして、 NullPointerException例外が発生します。
ここで、cについて調べます。
Console c = System.console();
となっています。System.console()メソッドがnullを返した場合、上記のように例外になります。
Consoleクラスのマニュアルを確認します。
http://docs.oracle.com/javase/jp/6/api/java/io/C …
> この仮想マシンにコンソールがある場合、そのコンソールは、System.console() メソッドを呼び出すことで取得できるこのクラスの一意のインスタンスによって表されます。コンソールデバイスが利用できない場合、メソッドの呼び出しは null を返します。
と、nullになる可能性があることが明記されています。
その下には、nullかどうかで後の処理を変更するような例が載っています。
kmee様、返信ありがとうございます。
Consoleクラスのマニュアルを読みましたが、具体的な対処法までは分かりませんでした。
リンク先にある下記のコードを使って修正すべきなのでしょうか?
【 Console cons;
char[] passwd;
if ((cons = System.console()) != null &&
(passwd = cons.readPassword("[%s]", "Password:")) != null) {
...
java.util.Arrays.fill(passwd, ' ');
}
】
試しに以下のように書き換えてみましたが、今度はローカル変数の重複により別のエラーが、
発生してしまいました。
package chapter12;
import java.io.Console;
class MyConsole_1
{
public static void main(String[] args) {
Console cons;
char[] passwd;
if ((cons = System.console()) != null &&
(passwd = cons.readPassword("[%s]", "Password:")) != null) {
Console cons = System.console();
java.util.Arrays.fill(passwd, ' ');
}
String s = cons.readLine("%s", "name : ");
char[] passwd = cons.readPassword("%s", "pass : ");
if(passwd.length == 4 && passwd[0] == 'w' && passwd[1] == 'i'
&& passwd[2] == 'l' && passwd[3] == 'l');
cons.format("Hello, %s\n", s);
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
時間の取得
-
C#の捕捉されない例外処理の対...
-
WebClient()以外でネットにアク...
-
【JAVA】与えられた金額を貨幣...
-
c# チェックか符号なしか
-
アサーションと例外処理の違い...
-
アロー関数のIE対応にpolyfill...
-
String型の日付(2005/11/25)の...
-
古い体質をそのまま引き継いで...
-
Excelでのエラー
-
throwとthrowsの違い
-
javaプログラムで背景色を変更...
-
nullで、return出来るのはどん...
-
エクセルVBAで、条件に一致する...
-
VBA 同じ名前のオブジェクトを...
-
オブジェクト参照がオブジェク...
-
エクセルVBA 画像を貼り付ける...
-
VB.netでメソッドからコントロ...
-
VB.NET getとsetの概念がわかり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
VB.NETで16進数が正しいかどう...
-
VB.Net Object型 空かどうか
-
Timestamp型への変換について(J...
-
C#の捕捉されない例外処理の対...
-
時間の取得
-
VBA Evaluate関数 型が一致しま...
-
C# UriFormatExceptionの回避
-
連続する「\\」をひとつの「\\...
-
文字列からダブルクオートの削除
-
String型の日付(2005/11/25)の...
-
タトゥーや墨を入れる人の共通点
-
VBA 400エラー 1004エラー
-
nullで、return出来るのはどん...
-
VC++におけるCStringの変換
-
例外ってIf文の中に入れますか...
-
【JAVA】与えられた金額を貨幣...
-
全角スペースのチェックについて
-
ファイルダイアログを開いた時...
-
WebClient()以外でネットにアク...
おすすめ情報