• ベストアンサー

プログラムが作動してくれません。(9月15日)

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); } }

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答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を返す、ということです。 別の入力手段を使うか、コマンドプロンプトから直接実行するかになります。

taro_11
質問者

お礼

kmee様、回答ありがとうございます。 コマンドプロンプトから実行させた所、無事に動いてくれました。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答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/Console.html > この仮想マシンにコンソールがある場合、そのコンソールは、System.console() メソッドを呼び出すことで取得できるこのクラスの一意のインスタンスによって表されます。コンソールデバイスが利用できない場合、メソッドの呼び出しは null を返します。 と、nullになる可能性があることが明記されています。 その下には、nullかどうかで後の処理を変更するような例が載っています。

taro_11
質問者

お礼

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

専門家に質問してみよう