• ベストアンサー

プログラムが作動してくれません。(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); } }

  • Java
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • 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

  • どうして’)’や’;’が足りないの?

    いつも大変お世話になりありがとうございます。 色々と打ち直したりしているのですが、どうしても コンパイルエラーが出ます。 どうすればいいのでしょうか? C:\JAVA>javac Lesson10.java Lesson10.java:11: エラー: ';'がありません Console console = System console(); ^ Lesson10.java:12: エラー: ')'がありません input = Integer.parseInt(console readLine()); ^ Lesson10.java:12: エラー: ';'がありません input = Integer.parseInt(console readLine()); ^ エラー3個 import java.io.Console; public class Lesson10 { public static void main(String[] args) { final int answer = 3; int input; System.out.println("コンピュータが思い浮かべた数字を当ててね!"); System.out.println("「これだ!」と思う数を1~10までで入力しましょう"); Console console = System console(); input = Integer.parseInt(console readLine()); if (input == answer) { System.out.println("お見事、アタリです!"); }else{ System.out.println("残念、ハズレです!"); } } }

    • ベストアンサー
    • Java
  • 簡単な入力出力のプログラムの間違いがわかりません

    こんにちは、さんたと申します。 よろしくお願い致します。 次のプログラムは、本に載っていたものを写したものです。何回も見直すのですが、エラーが出て止まってしまいます。もし、お分かりになられましたら、教えて下さいましたら幸いです。 よろしくお願い致します。 簡単な入力出力のプログラム(キーボードからの入力を読み込んで、画面に出力する) ********************************* c:\java_study>javac p2.java p2.java:7: ';' がありません。 While((line = in.readLine()) != null) { ^ エラー 1 個 ******************************* import java.io.*; public class p2 { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String line; While((line = in.readLine()) != null) { System.out.println(line); } } }

    • ベストアンサー
    • 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
  • 動くプログラムと動かないプログラム

    senをつかってプログラムを実行したところ import java.io.IOException; import net.java.sen.StringTagger; import net.java.sen.Token; public class SenSample { public static void main(String[] args) throws IllegalArgumentException, IOException { System.setProperty("sen.home","c:/sen"); StringTagger tagger = StringTagger.getInstance(); String str = "私の名前を当ててください"; Token[] token = tagger.analyze(str); for(int i=0; i<token.length; i++){ System.out.println(token[i].getBasicString() +"("+token[i].getTermInfo()+")"); } } } は動きましたが、 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Locale; import net.java.sen.StringTagger; import net.java.sen.Token; public class StringTaggerDemo { public static void main(String args[]) { try { <中略> } } } は動きません 結果↓ C:\java>java StringTaggerDemo done. Please input Japanese sentence: java.lang.IllegalArgumentException: C:\java\null\conf\sen.xml (指定されたパスが 見つかりません。) at net.java.sen.StringTagger.readConfig(StringTagger.java:304) at net.java.sen.StringTagger.init(StringTagger.java:145) at <中略>net.java.sen.StringTagger.getInstance(StringTagger.java:113) at StringTaggerDemo.main(StringTaggerDemo.java:13) -- Press any key to exit (Input "c" to continue) -- となります。 違いは何ですか??

    • ベストアンサー
    • Java
  • readLineとStringTokenizerで一行ずつ計算するプログラムでエラーが出る

    初めに行数があり、次に6つのスペースで区切られた数字を一行ずつ計算していくというプログラムが作りたいのですが、実行後 Exception in thread "main" java.lang.NullPointerException at java.util.StringTokenizer.<init>(StringTokenizer.java:182) at java.util.StringTokenizer.<init>(StringTokenizer.java:219) at example.main(example.java:36) のようなエラーが出てきます。下記がそのプログラムですが、stのコンストラクタがループの中に入っているせいだと思い、ループの外でコンストラクトしようと考えたのですがうまくいかずいきづまってしまいました。 どなたかご教示いただけませんでしょうか。よろしくお願いいたします。 int c=0; String line ; int ln = Integer.parseInt(br.readLine()); for(int i = 0; i < ln; i++) { line=br.readLine(); StringTokenizer st = new StringTokenizer(line); for(j = 0; j <= 5; j++) { c=Integer.parseInt(st.nextToken()); intArray[j]=c; } (計算) }

    • ベストアンサー
    • Java
  • BufferedReaderでのエラー

    Javaプログラムを作成しています. 標準入力で入力された文字列を表示し,exitが入力されるまで繰り返すプログラムです. エラーが出ますが,対策方法がわかりません. ソースコード,実行結果,エラーは以下の通りです. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Test { /** * @param args */ public static void main(String[] args) { System.out.println("Program starts."); while (true) { String input = null; input = getInputLine(); System.out.println("echo:" + input); if (input.equals("exit")) { break; } } System.out.println("Program exits."); } private static String getInputLine() { String input = null; BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(System.in)); input = br.readLine(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) { br.close(); } } catch (IOException e) { e.printStackTrace(); } } return input; } } Program starts. test echo:test echo:null java.io.IOException: Stream closed at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:145) at java.io.BufferedInputStream.read(BufferedInputStream.java:308) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) at java.io.InputStreamReader.read(InputStreamReader.java:167) at java.io.BufferedReader.fill(BufferedReader.java:136) at java.io.BufferedReader.readLine(BufferedReader.java:299) at java.io.BufferedReader.readLine(BufferedReader.java:362) at kadai1.Test.getInputLine(Test.java:34) at kadai1.Test.main(Test.java:18) Exception in thread "main" java.lang.NullPointerException at kadai1.Test.main(Test.java:21)

    • ベストアンサー
    • Java
  • プログラムが動いてくれません。

    下記のコードなのですが、6行目の「Scanner s = new Scanner(System.in);」に 問題があるみたいです。 はじめに100と入力して、次にxと入力してみたいです。 エクリプス4.2を使っています。引数を入れる場合、 メニュー欄の実行(R)→実行構成(N)→引数タブ→プログラムの引数(A)に 入力すればいいのですよね? よろしくお願い致します。 package chapter12; import java.util.Scanner; class Sample12_1 { public static void main(String[] args) { Scanner s = new Scanner(System.in); int i; while(true){ if(!s.hasNextInt()) break; i = s.nextInt(); System.out.println("input was " + i); } } }

    • ベストアンサー
    • Java
  • プログラム内でのPath設定

    javaのプログラム内でパスを設定することはできますか? public class Test { public static void main(String[] args) { System.setProperty("java.library.path", System.getProperty("java.library.path") + ";C:/library/path"); System.loadLibrary("library"); } } 上のようにすると以下のエラーが出ます。 java.lang.UnsatisfiedLinkError: no library in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1517) at java.lang.Runtime.loadLibrary0(Runtime.java:788) at java.lang.System.loadLibrary(System.java:834) at Test.main(Test.java:6) Exception in thread "main" 環境変数「PATH」に C:/library/path を設定すると System.loadlibrary("library") で libraryを読み込むことができます。 なぜ上のやり方では読み込めないか教えてください。

    • ベストアンサー
    • Java
  • どうしてもプログラムが動いてくれません....

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringWriter; public class Tese { public static void main(String[] args) throws InterruptedException, IOException { ★ ProcessBuilder pb = new ProcessBuilder("cmd", "/C", "dir", "C:\\Program Files\\Java"); ★ Process p = pb.start(); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); Catcher c = new Catcher(br); c.start(); p.waitFor(); p.destroy(); System.out.println(c.out.toString()); } } class Catcher extends Thread { Reader in; StringWriter out = new StringWriter(); public Catcher(Reader in) { this.in = in; } public void run() { int c; try { while ((c = in.read()) != -1) { out.write((char)c); } } catch (IOException e) { e.printStackTrace(); } } ★で囲んでいる部分なのですが,コンパイルすると Exception in thread "main" java.lang.Error: コンパイル問題が未解決です。 コンストラクター ProcessBuilder(String, String, String, String) は未定義です。 at Tese.main(Tese.java:10) というエラーが出ます. どうすればエラーが消えるかわかる方いらっしゃったら,ぜひ助言頂けないでしょうか・へj

    • ベストアンサー
    • Java
  • Javaのクラス作成について。

    現在、Javaで新規クラスを作成しています。 「String型の変数を受け取ってトリミングしてString型で返す」と言うプログラムを作成したいのですが、なかなかうまくいきません。 現在、考えているのは --- Trimming.java --- public class Trimming{ String new_id; public String TrimmingId(String id){ id = new_id; String idtrim = new_id.trim(); idtrim = id; return id; } } --- Test.java --- class Test{ public static void main(String[] args) { String id = " Trimming "; Trimming ID = new Trimming(); System.out.println(ID.TrimmingId(id)); } } --- 現在、出ているエラーは Exception in thread "main" java.lang.NullPointerException at Trimming.TrimmingId(Trimming.java:6) at Test2.main(Test2.java:6) です。 よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう