javaのエラーが回収できない

このQ&Aのポイント
  • java.lang.NumberFormatExceptionエラーが発生し、入力文字列が空であるために整数への変換ができない。
  • ユーザが入力した文字が配列に含まれているかどうかを判断し、結果を表示するプログラムの一部のコード。
  • ユーザが入力した文字をテストし、整数に変換しようとするコード。
回答を見る
  • ベストアンサー

javaのエラーが回収できない

JAVA初心者です。下記のエラーを直したいんですがよくわかりません。 Exception in thread "main" java.lang.NumberFormatException: For input string: "" at java.lang.NumberFormatException.forInputString(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at java.lang.Integer.parseInt(Unknown Source) at hangman.main(hangman.java:141) ソースを載せたいのですが200行程度あって全部載せられないので 関連しそうなところだけ載せます。 ~~~~~~~~~略~~~~~~~~~~~ try{ int input=System.in.read(); char str_moji1=(char)input; //ユーザの1文字入力 if(words[chosenWordRecord].indexOf(str_moji1) != -1){ System.out.println("debug:"+str_moji1+"の場所"+(words[chosenWordRecord].indexOf(str_moji1)+1)); } else{ System.out.println(str_moji1+"は含まれてないよ!"); } for(int arrayNum=0; arrayNum<wordArray.length; arrayNum++){ if(wordArray[arrayNum]==str_moji1){ System.out.print(" "+str_moji1); } else{ System.out.print(" _"); } } }catch(IOException e){ System.out.println(e); } try{ System.out.print("入力テスト:"); BufferedReader br1=new BufferedReader(new InputStreamReader(System.in)); String str=br1.readLine(); step=Integer.parseInt(str); //int型に変換 }catch(IOException e){ System.out.println(e);            //141行目 } ~~~~~~~~~略~~~~~~~~~~~ 状況としては、 ユーザの入力によって2つのテキストファイルを順にコマンドライン上に 表示しようとしているのですが1つ目のファイルから単語を呼んで処理を終えた後に、 2つ目のファイルを呼ぶための入力ができなくなっているようです。 かってに数字以外の文字が入力されてしまっているということでしょうか? エラーで指定された場所にcatch(NumberFormatException e){}も追加してみましたが ただエラーが表示されなくなるだけでした。 ちなみに変数はすべて宣言してあります。 解決方法ご存知の方いましたら教えてください。 よろしくお願いします。

noname#198479
noname#198479
  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • red_pana
  • ベストアンサー率28% (18/64)
回答No.1

なぜ、上がreadで、下がreadLineなのか・・・ 上の方の   int input=System.in.read(); をやると、Enterキーが押されるまで処理がストップします。 また、一文字しか読み込みません。 たとえば、「1」と入力して「Enter」を入力した場合、   (1)int input=System.in.read();にて「1」を読み込む   (2)String str=br1.readLine();にて「Enter」を読み込む(結果「str」には空文字が入る) となります。 ユーザーに何を入力させたいのかによりますが、 一番、単純な解決方法としては、   int input=System.in.read(); の下あたりに   int tmp;   while((tmp = System.in.read()) != '\n')   {    ;   } というコードを入れては如何でしょう。

noname#198479
質問者

お礼

ありがとうございます!無事解決しました。 ちなみにですが、 >なぜ、上がreadで、下がreadLineなのか・・・ 上は1文字だけの入力なのでSystem.in.read()、 下は文字列の入力なので.readLine()を使いました。 System.in.read()は1文字入力された時点で Enterを押す前に解決されてしまうということなんですね! どっちも.readLine()に統一した方がいいのでしょうか?

その他の回答 (1)

回答No.2

NumberFormatException で入力が空文字””ですと書いてありますね。 step=Integer.parseInt(str);//int型に変換 の部分の引数 str が ”” になっているためです。 Integer.parseInt は、数字として判定できる文字列を渡さなければいけません。 ちなみに Exception は例外であってエラーではないのでその辺も学習してくださいね。

noname#198479
質問者

お礼

ありがとうございます。 例外のFor input string: "" で文字が入力されていないことはわかったのですが どうして入力されないのかがどうしてもわからなかったので質問しました。 例外とエラーって違うんですね。 勉強しておきます。

関連するQ&A

  • 例外処理をするソースコードについて

    例外処理するソースコードについて質問があります。 まず例外処理される前のファイルのソースコードを見てください。 public class JTest13 { public static void main(String[] args) { System.out.println("実行開始"); long lngTmp; //以下を実行した瞬間に引数が無いか、整数に直せなかったら例外がスローされる lngTmp = Long.parseLong(args[0]); //割り算を実行する(小数点以下の数値を管理する必要がある)ため、double型に変換します System.out.println(Double.parseDouble(args[0]) / 2); System.out.println("tryブロック終了"); System.out.println("実行終了"); } } ここでアルファベットを入力すると、 実行開始 Exception in thread "main" java.lang.NumberFormatException: For input string: "a" at java.lang.NumberFormatException.forInputString(Unknown Source) at java.lang.Long.parseLong(Unknown Source) at java.lang.Long.parseLong(Unknown Source) at JTest13.main(JTest13.java:20) これで例外処理クラスがNumberFormatExceptionだと分かるんですが、 こういう結果がでなければいけません。 実行開始 例外:java.lang.NumberFormatException For input stirng:"a" 引数を整数で入力して下さい。 実行終了 これで問題なのがmainメソッドで例外処理するのではなく、整数チェック用のメソッド内でエラー処理するプログラムを作らなければならない事です。 変数がargs[0]なのでどうやってメソッドを作っていいのか分かりません。 ヒントだけでいいので、どうぞ宜しくお願い致します。

    • ベストアンサー
    • Java
  • CLASSPATHいじったらコンパイルエラー

    今までちゃんと動いていたプログラムが動かなくなりました。 原因が分かりません。どなたか教えてください。 環境------------ WinXP Eclipse Indigo JDK 1.6.0_2 --------------- やったこと 1.環境変数CLASSPATHを設定 2.CLASSPATHを削除 3.Windows再起動 これをやったら今まで動いてたやつが以下のエラーで コンパイルできなくなりました(;;) java.lang.NoClassDefFoundError: Print Caused by: java.lang.ClassNotFoundException: Print at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) Exception in thread "main" 不要と思いますがソースもノッケテおきます。 -*-*-*-*-*-*-*-*-*-*- public class Print { public static void main(String[] args) { try{ int n[] = {1,2,3}; for (int i = 0; i < 10; i++){ System.out.println(n[i]); } } catch(ArrayIndexOutOfBoundsException e){ System.out.println("配列の範囲を超えています"); } System.out.println("終了しまーす"); } } -*-*-*-*-*-*-*-*-*-*- よろしくお願いします。

    • ベストアンサー
    • Java
  • cygwinでjavaを実行するとエラー

    cygwinでjavaを実行するとエラーになるのですが、 解決策を教えていただけないでしょうか。 こんな所で数時間も考えてしまっており、作業が滞っています。 どなたか教えていただけないでしょうか。よろしくお願い致します。 cygwin上でenvを実行した時の結果です。(一部抜粋) JAVA_HOME=/cygdrive/c/Program Files/Java/jdk1.6.0_31 CLASSPATHも設定していたのですが、HelloWorld位だったら必要ないかと思い、unsetしました。 cygwinでプロジェクト直下に移動して、 コマンド「java HelloWorld」を実行すると以下のエラーとなる。 ============================================================================= $ java HelloWorld java.lang.NoClassDefFoundError: HelloWorld at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(Unknown Source) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$000(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) Could not find the main class: HelloWorld. Program will exit. Exception in thread "main" ============================================================================= 因みに、ソースは以下です。 [HelloWorld.java] package co.jp.test; public class HelloWorld { public static void main(String args[]){ System.out.println("HelloWorld"); } } また、ソースをパッケージから取り出して(パッケージを削除)、 プロジェクト直下にコピーして実行するとうまくいきます。 明らかに、パッケージにあるファイルをjavaコマンドで実行する時の固有のエラーかと思うのですが、 パッケージに含まれるファイルをcygwinで実行する時に気をつけることはありますでしょうか? 因みに、ソースは以下です。 [HelloWorld.java] public class HelloWorld { public static void main(String args[]){ System.out.println("HelloWorld"); } }

    • ベストアンサー
    • Java
  • javaのプログラムの質問です。

    10件まで登録できる簡易メモリストを作成して下さい 実行例: > java MemoList > コマンドを入力して下さい:list 1:俺達がガンダムだ! 2:ザクとは違うのだよザクとは! 3:当たらなければどうという事はない! コマンド list メモリストを1~の番号と共に表示 add メモを追加 del メモ番号を入力して削除 upd メモ番号を入力して上書き save ファイルに保存 h コマンド一覧を表示 q 終了 注意点 ・プログラム起動時にファイルからメモリストを読み込んで下さい ・保存するファイルは任意の固定ファイルで構いません ・メモは1~の連番で10件まで登録可能として下さい ・終了のコマンドが入力されるまで何度でもコマンド入力可能として下さい ・JavaDoc/プログラムコメントはしっかり記述して下さい ・エラー発生時は適切なメッセージを標準出力に出力して下さい という問題なのですが、以下のソースでとりあえずは動くのですが。 import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.ArrayList; class MemoList{ /** * メインメソッド **/ public static void main(String[] args) throws IOException { // Fileクラスのインスタンス化 File file1 = new File("C:\\WORK\\Memo.txt"); // FileReaderクラスのインスタンス化 FileReader filereader = new FileReader(file1); // FileWriterクラスのインスタンス化 FileWriter filewriter = new FileWriter(file1); // BufferedReader&InputStreamReaderクラスのインスタンス化 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); ArrayList <String> arraylist = new ArrayList<String>(); int num = 1; // while文ループを行う while(true){ System.out.println("> コマンドを入力して下さい:"); String str1 = br.readLine(); if("list".equals(str1)){    for(int i=0; i < arraylist.size(); i++){      System.out.println(i + 1 + ":" + arraylist.get(i));    } } else if("add".equals(str1)){ System.out.println("> メモを入力して下さい。"); if(arraylist.size() == 10){    System.out.println("> 10件登録されています。追加する場合は削除して下さい。");    delete(br,arraylist); }else{ String str2 = br.readLine(); arraylist.add(str2); } }else if("del".equals(str1)){ delete(br,arraylist); }else if("upd".equals(str1)){ System.out.println("> 上書きするメモ番号を入力して下さい。"); try{   String str4 = br.readLine();   int num2 = Integer.parseInt(str4);   System.out.println("> 上書きする内容を入力して下さい。");    String str5 = br.readLine();   arraylist.set(num2 - 1,str5); }catch(NumberFormatException e){ System.out.println("正しい番号を入力して下さい"); }catch(IndexOutOfBoundsException e){ System.out.println("正しい番号が入力されていないので上書き出来ません"); } (1)}else if("save".equals(str1)){ try{ for(int j=0; j < arraylist.size(); j++){ filewriter.write(arraylist.get(j) + "\r\n"); } System.out.println(">ファイルに保存しました。"); filewriter.close(); }catch(IOException e){ (2) System.out.println("ファイルに保存出来ません"); (3) } }else if("h".equals(str1)){ System.out.println("list:メモリストを1~の番号と共に表示"); System.out.println("add:メモを追加"); System.out.println("del:メモ番号を入力して削除"); System.out.println("upd:メモ番号を入力して上書き"); System.out.println("save:ファイルに保存"); }else if("q".equals(str1)){    System.out.println("> Terminated");    break; } } } // deleteメソッド public static void delete(BufferedReader br,ArrayList<String> arraylist) throws IOException { try{   System.out.println("削除するメモ番号を入力して下さい");   String str3 = br.readLine();   int num3 = Integer.parseInt(str3);   arraylist.remove(num3 - 1); }catch(IndexOutOfBoundsException e){     System.out.println("正しい番号を入力して下さい"); }catch(NumberFormatException e){    System.out.println("正しい番号以外は受け付けません"); } } } 読みにくいのはご容赦ください。 (1)と(3)の間の処理なのですが、現在のソースで実行した場合、適当に「add」でメモを書き、最初に「save」コマンドを入力するとちゃんとWORKフォルダ内に作成した「Memo.txt」に保存されます。しかし、2回目以降、コマンドを入力して処理を行い、saveコマンド入力すると、例外処理となり(2)が表示され、以降はどのコマンド処理をしても(2)が表示され続けるという具合になってしまいます。どなたか教えていただけないでしょうか?よろしくお願い致します。 通報する

    • ベストアンサー
    • Java
  • 構文がエラーになる

    Exception in thread"main"java.lang.NoClassDefFoundError という文章でエラーになります。 import java.io.*; class Sample34 { public static void main (String args[])throws IOException { System.out.println("整数を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int res = Integer.parseInt(str); if(res == 1){ System.out.println("1が入力されました。"); } else if(res == 2){ System.out.println("2が入力されました。"); } else{ System.out.println("1か2を入力してください。"); } } }

  • javaのコンパイルエラーについてです。

    「これならわかるJava」という本でjavaを勉強してます。 以下のソースコードをコンパイルした所、 「注:DogList.java の操作は、未チェックまたは安全ではありません。 注:詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください」 と、表示されます。 ネットで色々と調べてみましたが上手く行きません。 よろしくお願い致します。 import java.io.*; import java.util.*; class Dog { private String name; private int energy; public Dog(String n, int e){ name = n; if(e < 0) e = 0; energy = e; } public Dog(){ this("未定",50); } public void bark(){ if(energy == 0){ System.out.println("お腹が減ってほえられないよ。"); return; } System.out.println("わん、わん!"); energy--; } public void intro(){ System.out.println("僕の名前は" + name + "だ。わん。"); System.out.println("エネルギーは" + energy +"だ。わん。"); } public void eat(int e){ if(e < 0){ System.out.println("マイナスは与えられません。"); return; } energy += e; } public String getName(){ return name; } public void setName(String n){ name = n; } public int getEnergy(){ return energy; } public void setEnergy(int e){ if(e < 0) e = 0; energy = e; } public String toString(){ return "僕の名前は" + name + "だ。わん。\n" +"エネルギーは" + energy + "だ。わん。" ; } } class DogList { public static void main(String[] args) throws IOException { Vector dogs = new Vector(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str, name; int n, energy; for(;;){ System.out.println("名簿:どうしますか?"); System.out.println("1 一覧 2 追加 3 終了"); str = br.readLine(); n = Integer.parseInt(str); if(n == 1){ for(int i = 0; i < dogs.size(); i++){ ((Dog)dogs.elementAt(i)).intro(); System.out.println("-----"); } } else if(n == 2){ System.out.println("名前を入力:"); name = br.readLine(); System.out.println("エネルギーを入力:"); str = br.readLine(); energy = Integer.parseInt(str); dogs.addElement(new Dog(name, energy)); } else{ break; } } } }

    • ベストアンサー
    • Java
  • Javaで九九の計算

    今、Javaの勉強をしてる者です。勉強本の中に九九の問題があり、正しく動作することを確認したのですが、 入力された値が数値以外のものだった場合に、再入力させるプログラムに機能アップしたいと欲が出てきました。 現状のプログラムでは、入力値が整数でない場合、NumberFormatException で判定をして次の回に進んでしまってます。 int result = Integer.parseInt(line); の戻り値を判定して、整数でない場合に再入力させれば良いのかと予想したのですが、どう記載すべきかわかりません。 そもそもこの考え方は間違っているのか、別の方法が良いのかご教示いただけませんでしょうか。 --- import java.io.*; public class KuKu4 { public static final int max_question = 10; public static void main(String[] args){ int goodAns = 0; for(int i=0; i < max_question; i++){ boolean check = showQuestion(i+1); if(check){ goodAns++; } } double rate = (goodAns * 100 / max_question) ; System.out.println(""); System.out.println("正解は" + goodAns +"問"); System.out.println("間違いは" + (max_question - goodAns) +"問"); System.out.println("正答率は" + rate +"%"); } public static boolean showQuestion(int question){ int x = (int)(Math.random() * 9) + 1; int y = (int)(Math.random() * 9) + 1; BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); try{ System.out.println("[第" + question + "問]" + x + " * " + y + "== ?"); String line = reader.readLine(); int result = Integer.parseInt(line); if(x * y == result){ System.out.println("正しい"); return true; }else{ System.out.println("正しくない"); return false; } }catch(IOException e){ System.out.println(e); }catch(NumberFormatException e){ System.out.println("入力された値が正しくない"); } return false; } }

  • 実行するとよくわからないエラーがでる

    これを実行すると import java.lang.Integer; import java.lang.NumberFormatException; import java.lang.String; import java.lang.System; public class Animal { public static void main(String[] A00) { final int L00 = 6; int L01 = 0; int L02 = 0; int L03 = 0; if (A00.length < 3) { System.out.println("使用例 >java Animal 1969 6 26"); System.exit(1); } try { L01 = Integer.parseInt(A00[0]); L02 = Integer.parseInt(A00[1]); L03 = Integer.parseInt(A00[2]); } catch (NumberFormatException L04) { System.out.println("生年月日には数字を指定してください。"); System.exit(1); } int L05 = (L01 + L02 + L03) % L00; System.out.printf("%d年%d月%d日生まれのあなたは...%n", L01, L02, L03); switch (L05) { case 0: System.out.println("穏やかな心をもったヒツジです。"); break; case 1: System.out.println("おっとりマイペースのコアラです。"); break; case 2: System.out.println("自分が一番のライオンです。"); break; case 3: System.out.println("孤独が大好きなオオカミです。"); break; case 4: System.out.println("お調子者のサルです。"); break; case 5: default: System.out.println("不思議な性格のタスマニアンデビルで す。"); break; } } } # guarantee(_name_index != 0 && _signature_index != 0) failed: bad constant pool index for fieldDescriptor とエラーがでるのですが これはどういう意味でしょうか?

    • ベストアンサー
    • Java
  • 沢山のエラーメッセージが表示されます。

    いつも大変お世話になり、誠にありがとうございます。 標記の件。 public class Main2 { public static void main(String[] args) { for (int i = 1; i < 10; i++) { for (int j = 1; j < 10; j++) { System.out.println(i * j); System.out.println(" "); } System.out.println(" "); } } } C:\>cd JAVA C:\JAVA>javac Main2.java C:\JAVA>java Main2 Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: Main2 has been compiled by a more recent version of the Java Runtime (class file version 58.0), this version of the Java Runtime only recognizes class file versions up to 52.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$100(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source) どうすればいいでしょうか? ご多忙中恐れ入ります。 ご回答のほど、宜しくお願い申し上げます。

    • ベストアンサー
    • Java
  • JAVAのプログラムについて

    独学でJAVAを勉強中なのですが、 import java.io.*; public class ExserciseD5L3_2{ public static void main(String args[]){ BufferedReader br = new BufferedReader(newInputStreamReader(System.in),1); try{ System.out.println("■■■計算クイズ■■■"); System.out.println("計算してください。"); String Que[] = {"10×50=?","21-7=?","360÷6=?"}; int Ans[] = {500,14,60}; int counter; for(counter = 0; counter <=2; counter++ ){ System.out.println(Que[counter]); System.out.println("答えは?"); String str = br.readLine(); int i = Integer.parseInt(str); if(i == Ans[counter]){ System.out.println("おめでとう!大当たりです。"); } else{ System.out.println("残念!答えは"+Ans[counter]+"です。"); } } } catch(IOException e){ System.out.println("IOエラーが発生しました。"); } catch(NumberFormatException ne){ System.out.println("入力された数値が正しくないようです。"); } } } これを実行すると ■■■計算クイズ■■■ 計算してください。 10×50=? 答えは? 500 おめでとう!大当たりです。 21-7=? 答えは? 14 おめでとう!大当たりです。 360÷6=? 答えは? 60 おめでとう!大当たりです。 となるのですが、これに おめでとう!正解数は3つです。とか正解数は2つですなどのように 正解数も出るようにするにはどのようにしたらいいのでしょうか?

    • ベストアンサー
    • Java

専門家に質問してみよう