eclipseの不具合によりif文が判定されない

このQ&Aのポイント
  • eclipseの不具合によりif文が正しく判定されず、ブロック内部に移行しない状態が発生している。
  • 再現しようとしている電卓の条件分岐であふれ桁の判定を行っているが、eclipseでは正しく判定されない。
  • 不具合の解決方法として、eclipseの再インストールや配置の変更が考えられる。
回答を見る
  • ベストアンサー

eclipse if を判定しないのですが

こんにちは。趣味でプログラミングをしているものです。 さっそくですが、質問させていただきます。 文具店などで千円くらいで販売している電卓を再現しようとしているのですが、 コーディングが終わり、動作を確認しているのですが やはり、多くの不具合が出ていて、修正しようとしているのですが、 その中で、すこし奇妙に思えるようなものが発生してしまいました。 電卓で計算した結果の文字列を表示桁数に収めるようにする、 あるいは桁のあふれがあった場合、例外を投げる、というメソッド において、 単純な条件分岐を判定しない、というもののように思えるのですが、 以下にその抜粋したものを説明させていただきます。 seisu_length = len - 1; // test statement System.out.println( "seisu_length2 is " + String.valueOf( seisu_length )); System.out.println( seisu_length > 12 ); // if( (seisu_length > 12) ) //(ア) { gap = seisu_length - 12; overflag = true; retstring = retstring.substring( 0, 12 ); //test statement System.out.println( "(4)" ); // } len int 計算結果を表す文字列のlength()により、長さを格納 seisu_length int 整数部分の桁数、再現しようとしている電卓が 整数部分の桁数で表示桁のあふれを判定しているので gap int 再現しようとしている電卓が、あふれている桁数の情報を          答えの文字列の先頭から数えたインデックスにドットを 挿入するので overflag boolean 桁あふれの場合の処理に移るためのフラグ retstring String 表示桁数分の計算結果の文字列 このメソッドの戻り値 test statement は変数の値をみたり、このブロックに到達しているのか 確認しています。 上記の(ア)の部分の判定で ブロック内部に移らないのですが コードに誤りはないように思えるのですが eclipse に不具合が発生している、 ということでしょうか? eclipse をふたたびインストールというか 解凍して配置したほうがよいのでしょうか? ご存知のかた、教えていただけないでしょうか? よろしくお願いします。

noname#173931
noname#173931
  • Java
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.2

まず、処理の流れを確定することからはじめましょう。 今は、 「表示されない」 →ブロックが実行されていない という判断をされているかと思いますが、何らかの理由で表示されていないことも考えられるので、 実行の判断は、あくまでも表示された事実に基づくのがいいかと思います。 具体的には、次の2点を直して実行してみて下さい。 1:問題箇所のifに対するelseブロックを追加、メッセージを表示。 2:ifブロック内のメッセージ表示を、ブロックの最初にする。 これにより、どこを通っているか、またはそもそもここまで来ていないかが確定します。

noname#173931
質問者

お礼

回答していただきありがとうございます。 ご指摘していただいた内容を受けて 以下のように問題の部分を変更しました。 まず、ブロック内部の test statement をブロック先頭にもってきたら (4) が出力されましたので、ブロック内部には移っていることが わかりました。 そして、substring のところがおかしいことに気づきました。 retstring はメソッド内の冒頭で宣言し 仮の初期値として、""; を与えていました。 このメソッドに渡す仮引数は value としているのですが、 計算結果の文字列を加工したものを retstring に格納するのですから retstring = value.substring( index, index ) とするべきでした。 --------------------------------------------- seisu_length = len - 1; // test statement System.out.println( "seisu_length2 is " + String.valueOf( seisu_length )); System.out.println( seisu_length > 12 ); // if( seisu_length > 12 ) { //test statement System.out.println( "(4)" ); // gap = seisu_length - 12; overflag = true; retstring = value.substring( 0, 12 ); // 以前の内容 retstring = retstring.substring( 0, 12 ); // } --------------------------------------------- 上記のように修正したところ、 期待どおりの例外処理に移りました。 今回質問させていただいたところは解決しましたので 質問を終了させていただきます。 貴重な時間をさいての回答、ありがとうございました。

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

「ブロック内部に移らない」と思った根拠はなんですか? System.out.println( seisu_length > 12 ); がtrueを出力するなら、このifの条件も真のはずです。 気になるのは、これがプログラムそのままなのか、ということです。 単純にコピー→ペーストしたものなのか、その後、書き直したものなのか。 System.out.println( seisu_length > 12 ); の後から(ア)までの間で値が変化するようなことはないか、 ifの中が、括弧が二重になっていますが、本来は if( (seisu_length > 12) && (なにか別の条件) ) //(ア) とかになっていないか? 「例外を返す」とありますが、正常に期待通りの例外だけが返ってますか? ifの中で例外発生しているとかはないですか?

noname#173931
質問者

お礼

回答していただきありがとうございます。 ご指摘していただいた内容を受けて 以下のように問題の部分を変更しました。 まず、ブロック内部の test statement をブロック先頭にもってきたら (4) が出力されましたので、ブロック内部には移っていることが わかりました。 そして、substring のところがおかしいことに気づきました。 retstring はメソッド内の冒頭で宣言し 仮の初期値として、""; を与えていました。 このメソッドに渡す仮引数は value としているのですが、 計算結果の文字列を加工したものを retstring に格納するのですから retstring = value.substring( index, index ) とするべきでした。 --------------------------------------------- seisu_length = len - 1; // test statement System.out.println( "seisu_length2 is " + String.valueOf( seisu_length )); System.out.println( seisu_length > 12 ); // if( seisu_length > 12 ) { //test statement System.out.println( "(4)" ); // gap = seisu_length - 12; overflag = true; retstring = value.substring( 0, 12 ); // 以前の内容 retstring = retstring.substring( 0, 12 ); // } --------------------------------------------- 上記のように修正したところ、 期待どおりの例外処理に移りました。 今回質問させていただいたところは解決しましたので 質問を終了させていただきます。 貴重な時間をさいての回答、ありがとうございました。

  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

以前も書きましたが、seisu_lengthの値が説明の通りかわからないので、開示してください。 判定は合っているので、取得している部分がおかしいように思えます。 それとも > System.out.println( "seisu_length2 is " + String.valueOf( seisu_length )); > System.out.println( seisu_length > 12 ); 上記のコードは、 > seisu_length2 is 13 > true とか出力されるのでしょうか?せっかくSystem.outを入れているので、情報がほしいです。 あと、 > retstring = retstring.substring( 0, 12 ); これもおかしいように思います。電卓ならば、 先頭文字列を残すのではなく、末尾文字列を残すのではないでしょうか?

noname#173931
質問者

お礼

さっそく回答していただきありがとうございます。 説明不足ですいません。 計算の経過を説明させていただきます。 電卓を起動し オペランド A, B にそれぞれ、 "123456789123.", "10." の引数をコンストラクタに 与えて BegDecimal 型のインスタンスを生成し オペレータ は 掛け算なので、multiply によって 結果を得ました。 結果から文字列を得て( "1234567891230" ) 小数ではないので末尾にドットを追加してから この文字列を問題のメソッドの引数にして 文字列の加工に移りました。 この時点での文字列の長さは 14 です 最大表示桁数は12 なのでドットを加えて長さ13 の 文字列を得たいとしています。 抜粋して示したところの出力の内容を 示させていただきます。 -------------------------------- 出力結果 from validControl len is 14 from validControl "・"is len-1 ? : true seisu_length2 is 13 true -------------------------------- 説明不足ですいませんでした。 そうです、 true が表示されるのですが if 文のブロック内部に処理が移らないみたいなのです。 処理が移っていればブロック内部の(4)が 出力されるはずなのですが... retstring の加工についてはあとでできると思うのですが 恐れ入りますが、if のブロックに移らないことについて ご存知であれば教えていただけないでしょうか? やはり、eclipse に不具合が出ている、ということでしょうか? よろしくお願いします。

関連するQ&A

  • Java eclipse で条件判定しないのですが

    こんにちは。趣味でプログラミングをしているものです。 さっそくですが、質問させていただきます。 Eclipse を使って Javaで、文具店などで千円くらいで販売している 電卓を再現しようとしているのですが、 コーディングが終わり、動作を確認しているのですが やはり、多くの不具合が出てしまい、修正しようとしているのですが、 その中で、すこし奇妙に思えるようなものが発生してしまいました。 電卓で計算した結果の文字列を表示桁数に収めるようにする、 あるいは桁のあふれがあった場合、例外を投げる、というメソッド において、 単純な条件分岐を判定しない、というもののように思えるのですが、 以下にその抜粋したものを説明させていただきます。 seisu_length = len - 1; // test statement System.out.println( "seisu_length2 is " + String.valueOf( seisu_length )); System.out.println( seisu_length > 12 ); // if( (seisu_length > 12) ) //(ア) { gap = seisu_length - 12; overflag = true; retstring = retstring.substring( 0, 12 ); //test statement System.out.println( "(4)" ); // } len int 計算結果を表す文字列 整数に対する処理であり末尾に .(ドット) がついている seisu_length int 整数部分の桁数、再現しようとしている電卓が 整数部分の桁数で表示桁のあふれを判定しているので gap int 再現しようとしている電卓があふれている桁数の情報を          答えの文字列の先頭から数えたインデックスにドットを 挿入するので overflag boolean 桁あふれの場合の処理に移るためのフラグ retstring String 表示桁数分の計算結果の文字列 このメソッドの戻り値 test statement は変数の値をみたり、このブロックに到達しているのか 確認しています。 上記の(ア)の部分の判定で ブロック内部に移らないのですが コードに誤りはないように思えるのですが eclipse に不具合が発生している、 ということでしょうか? eclipse をふたたびインストールというか 解凍して配置したほうがよいのでしょうか? ご存知のかた、教えていただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 三つの文字を順に並べるプログラム

    三つの文字を入力して、順番に並べて表示させるプログラムが作りたいのですが、どうしたらいいのかわかりません。 二つまではできました。以下に記します import java.io.*; class Sample { public static void main(String args[]) throws IOException { System.out.println("文字列1を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1=br.readLine(); System.out.println("文字列2を入力してください。"); String str2=br.readLine(); int s = 1,t = 0; if(str1.length()>str2.length()){ int len=str1.length(); StringBuffer sb=new StringBuffer(str1); while(s<len+1){ sb.insert(s,str2.charAt(t)); s=s+2; t++; } System.out.println("文字列は"+sb+"となる。"); }else{ int len=str2.length(); StringBuffer sb=new StringBuffer(str2); while(s<len+1){ sb.insert(s-1,str1.charAt(t)); s=s+2; t++; } System.out.println("文字列は"+sb+"となる。"); } } } str1に123 str2に45といった風に入力すると14253といった風になります。 これにstr3を加え、str3が6789ならば、146257389 となる風にしたいです。

    • ベストアンサー
    • Java
  • Java 電卓を作っているのですが・・・

    こんにちは。 趣味でプログラミングをしているものです。 Java で電卓を再現しようとしていて、 コーディングが終わり動作を確認しているのですが、 わからないところがあるので質問させていただきました。 よろしくおねがいします。 平方根を求めるときなのですが、3や5などはある程度正確に求められている と思うのですが、 平方根を求めたとき整数になるもの 例えば9などは小数のまま表示されてしまいます。 電卓で表示され得るすべての実数について平方根を求めるには ニュートン法がよいと思うのですが・・・ 二点ほど質問させていただきます。 ------------------------------------ 質問A まず、BigDecimal型の平方根を求めて、 その toString() から得られた文字列を メソッドvalidControl( String value ) に渡すのですが その冒頭で末尾から先頭方向に続く'0' の列を取り除きたいのですが そのために、変数の中身をみてみたのがこの質問の下部のほうにある (ア) (イ) です。 sqrt(() などの演算結果でえられた文字列のうち 信頼できる範囲以下の文字列を validControl で切り取りたいのですが プロが実際に電卓を作るとしたら、 どのような処理になるのでしょうか? ------------------------------------ 質問B 平方根を求めるメソッドsqrt 内で二分法の処理では 除算のスケールを 64 に指定していますが、 実行結果(ア)(イ)の文字列の長さが異なるのは なぜでしょうか? ------------------------------------ private BigDecimal sqrt( BigDecimal value ) { BigDecimal two = new BigDecimal( "2" ); BigDecimal x = value.divide( two ); BigDecimal last_x = BigDecimal.ZERO; BigDecimal gap = x.subtract( last_x ); BigDecimal range = BigDecimal.ONE.movePointLeft( 64 ); BigDecimal t; while( gap.compareTo(range) > 0 ) { last_x = new BigDecimal( x.toString() ); //t = value.divide( x, 64, BigDecimal.ROUND_DOWN ); //(イ) //test statement t = value.divide( x, 64, RoundingMode.UP ); // (ア) // x = x.add( t ).divide( two ); gap = x.subtract( last_x ).abs(); } return x; } -------------------------------------- private String validControl( String value ) throws KETAException { String retstring = ""; boolean overflag = false; int idx1 = value.indexOf( '.' ); int gap = 0; int seisu_length = 0; // 整数部分の文字列の長さ int len = value.length(); int start = len-1; int idx2 = start; System.out.println( "(0)" + value ); System.out.println( "(1)" + String.valueOf( start ) ); while( value.charAt( idx2 ) == '0' ) { idx2 --; } if( idx2 != start ) { value = value.substring( 0, idx2 + 1 ); len = value.length(); } System.out.println( "(2)" +String.valueOf( idx2 ) ); // 以下省略 -------------------------------------- (ア) を実行したときの結果 (0) 3.000000000000000000000000000000000000 00000000000000000000000000000546875 (1)72 (2)72 --------------------------------------- (イ) を実行したときの結果 (0) 2.999999999999999999999999999999999999 999999999999999999999999999996875 (1)70 (2)70 -------------------------------------- 長文になり申しわけありませんが ご存知のかた教えていただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • Integerで変換する前に、0~9までの数字か判別したいです。

    /* // 桁数入力 の処理の部分で、Integerで変換する前に、0~9までの数字かどうか判別したいです。 入力した文字が'0'~'9'までの文字かどうか判別し、 trueなら、int len = Integer.parseInt(line) で変換し、 lenが1~10までの数値かどうか判別し、trueならwhileを抜ける それ以外は、もう一度入力するプログラムなのですか、 うまく作れなくて困ってます。 コンパイルはできましたが、入力時に入力が入らない現象がおきました。Ctrl + C では戻れます。 ここのプログラムが間違っているのですが、 if (line.length() != 0 && '0' >= line.charAt(i) && line.charAt(i) <= '9') { 何かいい方法はありませんか? */ // 数当てゲーム import java.io.*; public class Kazuate { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); // 宣言 StringBuffer sb = new StringBuffer(); // ランダムで生成したlen桁の数値 → 文字列にしたもの String line = null; // 入力文字 int len = 0; // 答えの桁数 int n = 0; // ランダムの数値記憶用 int counter = 0; // 比較回数 int match = 0; // 位置と数字が一致した数 int hit = 0; // 数値が一致した数 int linecounter = 0; // 重複チェック用カウンタ // 桁数を入力 System.out.print("1~10桁の数値当てゲームです。\n" + "同じ数値は出ないようになっています。\n" + "何桁の数当てゲームをやりますか?\n" + "桁数(1~10までの値): "); while (true) { for (int i = 0; i < len; i++) { line = reader.readLine(); if (line.length() != 0 && '0' >= line.charAt(i) && line.charAt(i) <= '9'){ len = Integer.parseInt(line); if (Integer.parseInt(line) >= 0 && Integer.parseInt(line) <= 10) { break; } } System.out.print("入力が間違っています。\n" + "もう一度を入力して下さい。\n" + "桁数(1~10までの値): "); continue; } break; } // コンピュータが数を生成 do { n = (int)(Math.random() * 10); line = String.valueOf(n); if (sb.toString().indexOf(line) == -1 || sb.length() == 0) { sb.append(n); } } while (sb.length() != len); //デバッグ用に表示 System.out.println(sb.toString()); //数当て outer: while (true) { line = null; match = 0; hit = 0; counter++; System.out.print(counter + "回目の比較\n" + "答えは? :"); line = reader.readLine(); // 入力した桁数の間違いをチェック if (line.length() == 0 || line.length() != sb.length()) { System.out.println("桁数が違います。"); counter--; continue; } for (int i = 0; i < len; i++) { for (int j = i + 1; j < len; j++) { if (line.charAt(i) == line.charAt(j)) { System.out.println("同じ数値を入れないで下さい。"); counter--; continue outer; } } } // 入力した数値とコンピュータの生成した数値を比較 // matchとhitをカウント match = 0; hit = 0; for (int i = 0; i < len; i++) { if (sb.charAt(i) == line.charAt(i)) { match++; } for (int j = 0; j < len; j++) { if (sb.toString().charAt(i) == line.charAt(j)) { hit++; } } } // 判定・表示 if (sb.toString().equals(line) == false) { System.out.print("間違いです\n" + "match(位置と数字が一致した数) = " + match + "\n" + "hit(数値が一致した数) = " + hit + "\n"); } else { System.out.println("正解です。\n" + "答えは" + sb.toString() + "です\n" + "お疲れさまでした。"); break; } } } }

    • ベストアンサー
    • Java
  • 数値を文字列に変換する?

    下のプログラムでなぜString ss= " "+dt;のように数値を文字列に変換しないとだめなんでしょうか? ちなみに桁数設定メソッドを作るプログラムです。 public class JcWidth { // JcWidth.java [java] public static void main(String args[]) { System.out.println(":" + toIntWidth(123, 8) + ":"); System.out.println(":" + toIntWidth(12345, 8) + ":"); System.out.println(":" + toIntWidth(-1234567890, 8) + ":"); System.out.println(":" + toHexWidth(4095, 8) + ":"); System.out.println(":" + toHexWidth(123456789, 8) + ":"); } // int値dtを先行空白付きw桁(最大12)の表現にする // 数値が指定幅より大きいときは必要な幅にする public static String toIntWidth(int dt, int w) { if (w > 12) w = 12; String ss = "" + dt; // 数値を文字列にする if (ss.length() > w) w = ss.length(); ss = " " + dt; return ss.substring(ss.length()-w); } // int値dtを先行0付きw桁(最大8)の16進数大文字表現にする public static String toHexWidth(int dt, int w) { if (w > 8) w = 8; String ss = Integer.toHexString(dt).toUpperCase(); if (ss.length() > w) w = ss.length(); ss = "0000000" + ss; return ss.substring(ss.length()-w); } } 

    • ベストアンサー
    • Java
  • 【Java】数字の判定、Stringへの型変換

    コマンドライン引数を渡して(桁数は様々)、 渡ってきた値が数字のみの場合は値をそのまま出力、 数字のみでなければ1文字ずつ縦に出力するプログラムを作りたいです。 Exceptionを発生させたり正規表現で判定するのではなく、 isNumericを使いたいのですが、型が違うので使えません。 1文字ずつ出力するのはcharAtかなと思ったのですがこれも型が違う。 型変換するにもどこですればいいのか分からず… どこを変えれば良いのか教えて下さい。 public class Test1 { public static void main(String[] args) { if(StringUtils.isNumeric(args)){ System.out.println(args); }else{ for(int i = 0; i<args.length; i++){ System.out.println(args.charAt()); } } } }

    • ベストアンサー
    • Java
  • 全角スペースの判定について

    全角のスペースを文字コードにて判定したいのですが、 うまく判定できません。 0x8140だと思うのですが。。。。 以下のソースを実行すると半角は通るのに全角は NGになってしまいます。どなたがご存知方はご教授のほど宜しくお願いいたします。 public class test {  public static void main(String[] args) {      String s = "| | |";      for (int i = 0; i < 4; i++) {           System.out.println("" + s.charAt(i));   }      char c = s.charAt(1);    if (0x8140 == c) { System.out.println("全角判定OK");    } else { System.out.println("全角判定NG");    }   c = s.charAt(3);    if (0x0020 == c) { System.out.println("半角判定OK");    } else { System.out.println("半角判定NG");    }  } }

    • ベストアンサー
    • Java
  • ■文字コード判定■

    あるバッファに入っている文字列の文字コード(ANSI、SJIS、UNICODEなど)を判定したいのですが、色々と調べたのですが、解決しませんでした。 ANSIでもUNICODEでもきちんと文字列を扱えるアプリケーションを開発しています、問題となる例です↓ (メッセージボックス) int MessageBox_OK( HWND hWnd, LPCTSTR lpCaption, LPCTSTR lpText ) { int ret; int len_w; LPWSTR wCaption, wText; //変換後の、UNICODE文字列取得バッファ //コンパイル設定がUNICODEの時に、ANSIをUNICODEに変換する #ifdef UNICODE //ここで文字コードを判定したいです|・ω・`) //UNICODEでなかったらUNICODEに変換する len_w = AnsiToUnicode_Size( lpCaption ); len_w = len_w * sizeof(WCHAR); wCaption = (LPWSTR)malloc( len_w + 1 ); AnsiToUnicode_Convert( lpCaption, wCaption ); //ここで文字コードを判定したいです|・ω・`) len_w = AnsiToUnicode_Size( lpText ); len_w = len_w * sizeof(WCHAR); wText = (LPWSTR)malloc( len_w + 1 ); AnsiToUnicode_Convert( lpText, wText ); #else return MessageBox( hWnd, lpText, lpCaption, MB_OK ); #endif return MessageBox( hWnd, wText, wCaption, MB_OK ); } //ANSI→UNICODE (必要サイズ(文字数)) int AnsiToUnicode_Size( LPCSTR strAnsi ); //ANSI→UNICODE (変換) BOOL AnsiToUnicode_Convert( LPCSTR strAnsi, LPWSTR strUnicode ); よろしくお願いします。

  • length()の使い方がわかりません

     java初心者です、宜しくお願いします。    lengthを配列につかってやるとlength()とするとエラーになります。  また、文字列ではlength()としないとエラーになります。  どこかこのプログラムが間違っているのでしょうか。   色々と参考書とかWEBで調べてもさっぱりわかりません。  どなたか宜しくご教示お願い致します。 ================================================================= public class H1 { public static void main(String[] args) { int d[] = {1,2}; String s = "abcd" ; System.out.println(d.length); System.out.println(s.length()); } }

    • ベストアンサー
    • Java
  • 続・ZZZ,ZZZ,ZZ9形式の金額形式変換の件

    前投稿で解決した件で追加でのご質問ですが 例 9桁の数値文字列→カンマと*を含んだ11桁の文字列 000000000     → **********0 000000999    → ********999 123456789    → 123,456,789 と実行結果を求めたいときに下記ソースで解決しました。 int value = Integer.valueOf(九桁金額1).intValue(); NumberFormat nf = new DecimalFormat("###,###,##0"); String formatted = nf.format(value); //***,***,***形式Ver System.out.print("***,***,*** ".substring(formatted.length()) + formatted +"|"); } こちらに int value = Integer.valueOf(九桁金額2).intValue(); と別の金額項目を加えたいときに IF分で何々の時は九桁金額1 何々の時は九桁金額2と条件判定した場合 System.out.printの結果は int value = Integer.valueOf(九桁金額1).intValue();で int型から読み込んだ文字列は DecimalFormatの値に依存しているため 条件が増えるたびに System.out.print結果を変更しなければなりません。 九桁金額1と九桁金額2のSystem.out.print結果を その都度変更せずに 判定させる方法はありますでしょうか? どうぞよろしくお願いいたします。

    • ベストアンサー
    • Java

専門家に質問してみよう