こんにちは。趣味でプログラミングをしているものです。
さっそくですが、質問させていただきます。
文具店などで千円くらいで販売している電卓を再現しようとしているのですが、
コーディングが終わり、動作を確認しているのですが
やはり、多くの不具合が出ていて、修正しようとしているのですが、
その中で、すこし奇妙に思えるようなものが発生してしまいました。
電卓で計算した結果の文字列を表示桁数に収めるようにする、
あるいは桁のあふれがあった場合、例外を投げる、というメソッド
において、
単純な条件分岐を判定しない、というもののように思えるのですが、
以下にその抜粋したものを説明させていただきます。
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 をふたたびインストールというか
解凍して配置したほうがよいのでしょうか?
ご存知のかた、教えていただけないでしょうか?
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
まず、処理の流れを確定することからはじめましょう。
今は、
「表示されない」
→ブロックが実行されていない
という判断をされているかと思いますが、何らかの理由で表示されていないことも考えられるので、
実行の判断は、あくまでも表示された事実に基づくのがいいかと思います。
具体的には、次の2点を直して実行してみて下さい。
1:問題箇所のifに対するelseブロックを追加、メッセージを表示。
2:ifブロック内のメッセージ表示を、ブロックの最初にする。
これにより、どこを通っているか、またはそもそもここまで来ていないかが確定します。
回答していただきありがとうございます。
ご指摘していただいた内容を受けて
以下のように問題の部分を変更しました。
まず、ブロック内部の 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 );
//
}
---------------------------------------------
上記のように修正したところ、
期待どおりの例外処理に移りました。
今回質問させていただいたところは解決しましたので
質問を終了させていただきます。
貴重な時間をさいての回答、ありがとうございました。
No.3
- 回答日時:
「ブロック内部に移らない」と思った根拠はなんですか?
System.out.println( seisu_length > 12 );
がtrueを出力するなら、このifの条件も真のはずです。
気になるのは、これがプログラムそのままなのか、ということです。
単純にコピー→ペーストしたものなのか、その後、書き直したものなのか。
System.out.println( seisu_length > 12 );
の後から(ア)までの間で値が変化するようなことはないか、
ifの中が、括弧が二重になっていますが、本来は
if( (seisu_length > 12) && (なにか別の条件) ) //(ア)
とかになっていないか?
「例外を返す」とありますが、正常に期待通りの例外だけが返ってますか?
ifの中で例外発生しているとかはないですか?
回答していただきありがとうございます。
ご指摘していただいた内容を受けて
以下のように問題の部分を変更しました。
まず、ブロック内部の 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 );
//
}
---------------------------------------------
上記のように修正したところ、
期待どおりの例外処理に移りました。
今回質問させていただいたところは解決しましたので
質問を終了させていただきます。
貴重な時間をさいての回答、ありがとうございました。
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 );
これもおかしいように思います。電卓ならば、
先頭文字列を残すのではなく、末尾文字列を残すのではないでしょうか?
さっそく回答していただきありがとうございます。
説明不足ですいません。
計算の経過を説明させていただきます。
電卓を起動し
オペランド 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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
Log4jで機能毎に別ファイルへ出...
-
System.out.printlnの出力先
-
system.out.printが出力されない
-
flush()とclose()について
-
Javaで改行などが出来ないのです。
-
switch分が機能しません。
-
1~100までの数字を表示し、か...
-
行ごとに文を単語単位で逆順に...
-
1~100までの数字を表示したい
-
PrintWriterとBufferedWriterの...
-
ArrayList内HashMapの取得
-
Tomcatが無応答となる現象が起...
-
現在の日付をJST形式で取得...
-
tomcatのstdout.logを停止したい。
-
StringBufferで改ページ処理を...
-
Eclipseのコンソールを常に表示...
-
JavaScriptでcgiの戻り値を受け...
-
OutputStreamの内容を確認する...
-
OpenSSL関数エラーについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
flush()とclose()について
-
Log4jで機能毎に別ファイルへ出...
-
System.out.printlnの出力先
-
Javaで改行などが出来ないのです。
-
1~100までの数字を表示し、か...
-
system.out.printが出力されない
-
Eclipseのコンソールを常に表示...
-
1~100までの数字を表示したい
-
StringBufferで改ページ処理を...
-
JavaScriptの変数をjavaのメソ...
-
Log4Jではログを改行できない?
-
javaにおけるCSV出力時の文字コ...
-
テキストエリアで改行する
-
switch分が機能しません。
-
Tomcatが無応答となる現象が起...
-
一定のスペースを空けて端を揃...
-
JAVAのServletで、画像表示につ...
-
バイトスワップ
-
InputStreamはreadが1回しかで...
おすすめ情報