🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Q&A

解決済

1回答

1781閲覧

javaの電卓作成にて割り算の結果を小数点が出る様にしたいです。

Damaku_ProG

総合スコア29

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

0グッド

0クリップ

投稿2019/11/15 10:42

編集2019/11/15 12:04

前提・実現したいこと

javaで電卓(整数の入力のみ)を作成しています。
ソースコードの185行目 BigDecimal ansbi = i2.divide(k2);の部分でjava.lang.PointerExceptionのエラーが出ていて解決できないので、解決したいです。
また、割り算の結果を小数点が出る様にしたいです。
よろしくお願いします。

発生している問題・エラーメッセージ

エラーメッセージ

java.lang.PointerException

該当のソースコード

java

1ソースコード 2import javax.swing.JFrame; 3import javax.swing.JPanel; 4import javax.swing.JButton; 5import javax.swing.JTextField; 6import javax.swing.border.LineBorder; 7import java.awt.BorderLayout; 8import java.awt.GridLayout; 9import java.awt.Color; 10import java.awt.Font; 11import java.awt.Dimension; 12import java.awt.event. *; 13import java.math.BigDecimal; 14 15public class Dentaku extends JFrame implements ActionListener{ 16 17 JTextField jtf = new JTextField(20); 18 19 //ボタン作成 20 JButton btn1 = new JButton("1"); 21 JButton btn2 = new JButton("2"); 22 JButton btn3 = new JButton("3"); 23 JButton btn4 = new JButton("4"); 24 JButton btn5 = new JButton("5"); 25 JButton btn6 = new JButton("6"); 26 JButton btn7 = new JButton("7"); 27 JButton btn8 = new JButton("8"); 28 JButton btn9 = new JButton("9"); 29 JButton btnTasu = new JButton("+"); 30 JButton btnHiku = new JButton("-"); 31 JButton btnKakeru = new JButton("×"); 32 JButton btnWaru = new JButton("÷"); 33 JButton btnIkoru = new JButton("="); 34 JButton btn0 = new JButton("0"); 35 JButton btnClear = new JButton("AC"); 36 37 38 static int i = 0;//最初の数をString→intにする。 39 static int j = 0;//加減乗除判別 40 static BigDecimal i2; //割り算用最初の数 41 static BigDecimal k2;//割り算用次の数 42 43 44 45 public static void main(String[] args){ 46 Dentaku jf = new Dentaku(); 47 48 jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 49 jf.setVisible(true); 50 51 } 52 Dentaku(){ 53 54 //フレームの作成 55 setBounds(100, 100, 500, 500); 56 setTitle("自作電卓"); 57 58 //上側のパネルの作成 59 JPanel jp1 = new JPanel(); 60 jp1.setBackground(Color.BLACK); 61 jp1.setPreferredSize(new Dimension(500, 100)); 62 jp1.setLayout(new BorderLayout()); 63 64 //真ん中のパネルの作成 65 JPanel jp2 = new JPanel(); 66 jp2.setBackground(Color.RED); 67 68 GridLayout layout = new GridLayout(); 69 layout.setColumns(3); 70 layout.setRows(4); 71 jp2.setLayout(layout); 72 73 74 //ボタンをアクションリスナーに登録 75 btn1.addActionListener(this); 76 btn2.addActionListener(this); 77 btn3.addActionListener(this); 78 btn4.addActionListener(this); 79 btn5.addActionListener(this); 80 btn6.addActionListener(this); 81 btn7.addActionListener(this); 82 btn8.addActionListener(this); 83 btn9.addActionListener(this); 84 btnTasu.addActionListener(this); 85 btnHiku.addActionListener(this); 86 btnKakeru.addActionListener(this); 87 btnWaru.addActionListener(this); 88 btnIkoru.addActionListener(this); 89 btn0.addActionListener(this); 90 btnClear.addActionListener(this); 91 92 //ボタン貼り付け 93 jp2.add(btn1); 94 jp2.add(btn2); 95 jp2.add(btn3); 96 jp2.add(btnTasu); 97 jp2.add(btn4); 98 jp2.add(btn5); 99 jp2.add(btn6); 100 jp2.add(btnHiku); 101 jp2.add(btn7); 102 jp2.add(btn8); 103 jp2.add(btn9); 104 jp2.add(btnKakeru); 105 jp2.add(btnIkoru); 106 jp2.add(btn0); 107 jp2.add(btnClear); 108 jp2.add(btnWaru); 109 110 //テキストフィールド作成 111 jtf.setPreferredSize(new Dimension(300, 80)); 112 jtf.setBorder(new LineBorder(Color.BLACK, 6)); 113 jtf.setFont(new Font("MSゴシック", Font.PLAIN, 32)); 114 115 //テキストフィールド貼り付け 116 jp1.add(jtf); 117 118 //フレームにパネルを張り付ける 119 getContentPane().add(jp1, BorderLayout.NORTH); 120 getContentPane().add(jp2, BorderLayout.CENTER); 121 } 122 123 public void actionPerformed(ActionEvent e){ 124 125 String kazu = jtf.getText(); 126 127 128 if (e.getSource() == btn1 ){ //1のボタンを押した場合 129 jtf.setText( kazu + "1"); 130 }else if (e.getSource() == btn2 ){ //2のボタンを押した場合 131 jtf.setText( kazu + "2"); 132 }else if (e.getSource() == btn3 ){ //3のボタンを押した場合 133 jtf.setText( kazu + "3"); 134 }else if (e.getSource() == btn4 ){ //4のボタンを押した場合 135 jtf.setText( kazu + "4"); 136 }else if (e.getSource() == btn5 ){ //5のボタンを押した場合 137 jtf.setText( kazu + "5"); 138 }else if (e.getSource() == btn6 ){ //6のボタンを押した場合 139 jtf.setText( kazu + "6"); 140 }else if (e.getSource() == btn7 ){ //7のボタンを押した場合 141 jtf.setText( kazu + "7"); 142 }else if (e.getSource() == btn8 ){ //8のボタンを押した場合 143 jtf.setText( kazu + "8"); 144 }else if (e.getSource() == btn9 ){ //9のボタンを押した場合 145 jtf.setText( kazu + "9"); 146 }else if (e.getSource() == btn0 ){ //0のボタンを押した場合 147 jtf.setText( kazu + "0"); 148 }else if (e.getSource() == btnTasu ){ //+のボタンを押した場合 149 i = Integer.parseInt(kazu); 150 j = 1; 151 jtf.setText(""); 152 }else if (e.getSource() == btnHiku ){ //-のボタンを押した場合 153 i = Integer.parseInt(kazu); //String→intに入力した変換 154 j = 2; 155 jtf.setText(""); 156 }else if (e.getSource() == btnKakeru ){ //×のボタンを押した場合 157 i = Integer.parseInt(kazu); //最初の数字をString→intに入力した変換 158 j = 3; 159 jtf.setText(""); 160 }else if (e.getSource() == btnWaru ){ //÷のボタンを押した場合 161 BigDecimal i2 = new BigDecimal(kazu); 162 i = Integer.parseInt(kazu); 163 j = 4; 164 jtf.setText(""); 165 }else if (e.getSource() == btnClear ){ //ACボタンを押した場合 166 167 jtf.setText(""); 168 }else if (e.getSource() == btnIkoru ){ //=のボタンを押した場合 169 BigDecimal k2 = new BigDecimal(kazu); //次の数字をString→intに入力した変換 170 int k = Integer.parseInt(kazu); 171 int ansint = 0; 172 173 if ( j == 1 ){ //足し算の場合 174 ansint = i + k; 175 String ans = String.valueOf(ansint); 176 jtf.setText(ans); 177 }else if ( j == 2 ){ //引き算の場合 178 ansint = i - k; 179 String ans = String.valueOf(ansint); 180 jtf.setText(ans); 181 }else if ( j == 3 ){ //掛け算の場合 182 ansint = i * k; 183 String ans = String.valueOf(ansint); 184 jtf.setText(ans); 185 }else if ( j == 4 ){ //割り算の場合 186 BigDecimal ansbi = i2.divide(k2); 187 String ans = ansbi.toString(); 188 jtf.setText(ans); 189 } 190 191 } 192 } 193 194 195}
コード

試したこと

正直な所、プログラムを始めて2週間ほどの初心者の為、大したことはできていませんが、変数をstaticにした事くらいしか試せていません。

補足情報(FW/ツールのバージョンなど)

OS : Windows10 64bit
Javaのversion : jdk1.8.0_231

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/11/15 11:10

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
Damaku_ProG

2019/11/15 12:06

返信ありがとうございます。 インデントがつくように修正しました。 よろしくお願いします。
guest

回答1

0

ベストアンサー

始めたばっかりでこれだけ出来るのはすごいですね!
158行目のBigDecimalがいらないですね。
新しく定義して使わなくなっちゃうので。

小数点は183行目のdivideに桁数をと丸めの引数を入れてあげればできます。
頑張ってください。

Dentaku.java

1import java.awt.BorderLayout; 2import java.awt.Color; 3import java.awt.Dimension; 4import java.awt.Font; 5import java.awt.GridLayout; 6import java.awt.event.ActionEvent; 7import java.awt.event.ActionListener; 8import java.math.BigDecimal; 9 10import javax.swing.JButton; 11import javax.swing.JFrame; 12import javax.swing.JPanel; 13import javax.swing.JTextField; 14import javax.swing.border.LineBorder; 15 16public class Dentaku extends JFrame implements ActionListener { 17 18 JTextField jtf = new JTextField(20); 19 20 //ボタン作成 21 JButton btn1 = new JButton("1"); 22 JButton btn2 = new JButton("2"); 23 JButton btn3 = new JButton("3"); 24 JButton btn4 = new JButton("4"); 25 JButton btn5 = new JButton("5"); 26 JButton btn6 = new JButton("6"); 27 JButton btn7 = new JButton("7"); 28 JButton btn8 = new JButton("8"); 29 JButton btn9 = new JButton("9"); 30 JButton btnTasu = new JButton("+"); 31 JButton btnHiku = new JButton("-"); 32 JButton btnKakeru = new JButton("×"); 33 JButton btnWaru = new JButton("÷"); 34 JButton btnIkoru = new JButton("="); 35 JButton btn0 = new JButton("0"); 36 JButton btnClear = new JButton("AC"); 37 38 static int i = 0;//最初の数をString→intにする。 39 static int j = 0;//加減乗除判別 40 static BigDecimal i2; //割り算用最初の数 41 static BigDecimal k2;//割り算用次の数 42 43 public static void main(String[] args) { 44 Dentaku jf = new Dentaku(); 45 46 jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 47 jf.setVisible(true); 48 49 } 50 51 Dentaku() { 52 53 //フレームの作成 54 setBounds(100, 100, 500, 500); 55 setTitle("自作電卓"); 56 57 //上側のパネルの作成 58 JPanel jp1 = new JPanel(); 59 jp1.setBackground(Color.BLACK); 60 jp1.setPreferredSize(new Dimension(500, 100)); 61 jp1.setLayout(new BorderLayout()); 62 63 //真ん中のパネルの作成 64 JPanel jp2 = new JPanel(); 65 jp2.setBackground(Color.RED); 66 67 GridLayout layout = new GridLayout(); 68 layout.setColumns(3); 69 layout.setRows(4); 70 jp2.setLayout(layout); 71 72 //ボタンをアクションリスナーに登録 73 btn1.addActionListener(this); 74 btn2.addActionListener(this); 75 btn3.addActionListener(this); 76 btn4.addActionListener(this); 77 btn5.addActionListener(this); 78 btn6.addActionListener(this); 79 btn7.addActionListener(this); 80 btn8.addActionListener(this); 81 btn9.addActionListener(this); 82 btnTasu.addActionListener(this); 83 btnHiku.addActionListener(this); 84 btnKakeru.addActionListener(this); 85 btnWaru.addActionListener(this); 86 btnIkoru.addActionListener(this); 87 btn0.addActionListener(this); 88 btnClear.addActionListener(this); 89 90 //ボタン貼り付け 91 jp2.add(btn1); 92 jp2.add(btn2); 93 jp2.add(btn3); 94 jp2.add(btnTasu); 95 jp2.add(btn4); 96 jp2.add(btn5); 97 jp2.add(btn6); 98 jp2.add(btnHiku); 99 jp2.add(btn7); 100 jp2.add(btn8); 101 jp2.add(btn9); 102 jp2.add(btnKakeru); 103 jp2.add(btnIkoru); 104 jp2.add(btn0); 105 jp2.add(btnClear); 106 jp2.add(btnWaru); 107 108 //テキストフィールド作成 109 jtf.setPreferredSize(new Dimension(300, 80)); 110 jtf.setBorder(new LineBorder(Color.BLACK, 6)); 111 jtf.setFont(new Font("MSゴシック", Font.PLAIN, 32)); 112 113 //テキストフィールド貼り付け 114 jp1.add(jtf); 115 116 //フレームにパネルを張り付ける 117 getContentPane().add(jp1, BorderLayout.NORTH); 118 getContentPane().add(jp2, BorderLayout.CENTER); 119 } 120 121 public void actionPerformed(ActionEvent e) { 122 123 String kazu = jtf.getText(); 124 125 if (e.getSource() == btn1) { //1のボタンを押した場合 126 jtf.setText(kazu + "1"); 127 } else if (e.getSource() == btn2) { //2のボタンを押した場合 128 jtf.setText(kazu + "2"); 129 } else if (e.getSource() == btn3) { //3のボタンを押した場合 130 jtf.setText(kazu + "3"); 131 } else if (e.getSource() == btn4) { //4のボタンを押した場合 132 jtf.setText(kazu + "4"); 133 } else if (e.getSource() == btn5) { //5のボタンを押した場合 134 jtf.setText(kazu + "5"); 135 } else if (e.getSource() == btn6) { //6のボタンを押した場合 136 jtf.setText(kazu + "6"); 137 } else if (e.getSource() == btn7) { //7のボタンを押した場合 138 jtf.setText(kazu + "7"); 139 } else if (e.getSource() == btn8) { //8のボタンを押した場合 140 jtf.setText(kazu + "8"); 141 } else if (e.getSource() == btn9) { //9のボタンを押した場合 142 jtf.setText(kazu + "9"); 143 } else if (e.getSource() == btn0) { //0のボタンを押した場合 144 jtf.setText(kazu + "0"); 145 } else if (e.getSource() == btnTasu) { //+のボタンを押した場合 146 i = Integer.parseInt(kazu); 147 j = 1; 148 jtf.setText(""); 149 } else if (e.getSource() == btnHiku) { //-のボタンを押した場合 150 i = Integer.parseInt(kazu); //String→intに入力した変換 151 j = 2; 152 jtf.setText(""); 153 } else if (e.getSource() == btnKakeru) { //×のボタンを押した場合 154 i = Integer.parseInt(kazu); //最初の数字をString→intに入力した変換 155 j = 3; 156 jtf.setText(""); 157 } else if (e.getSource() == btnWaru) { //÷のボタンを押した場合 158 i2 = new BigDecimal(kazu); 159 i = Integer.parseInt(kazu); 160 j = 4; 161 jtf.setText(""); 162 } else if (e.getSource() == btnClear) { //ACボタンを押した場合 163 164 jtf.setText(""); 165 } else if (e.getSource() == btnIkoru) { //=のボタンを押した場合 166 BigDecimal k2 = new BigDecimal(kazu); //次の数字をString→intに入力した変換 167 int k = Integer.parseInt(kazu); 168 int ansint = 0; 169 170 if (j == 1) { //足し算の場合 171 ansint = i + k; 172 String ans = String.valueOf(ansint); 173 jtf.setText(ans); 174 } else if (j == 2) { //引き算の場合 175 ansint = i - k; 176 String ans = String.valueOf(ansint); 177 jtf.setText(ans); 178 } else if (j == 3) { //掛け算の場合 179 ansint = i * k; 180 String ans = String.valueOf(ansint); 181 jtf.setText(ans); 182 } else if (j == 4) { //割り算の場合 183 BigDecimal ansbi = i2.divide(k2, 4, BigDecimal.ROUND_HALF_UP); 184 String ans = ansbi.toString(); 185 jtf.setText(ans); 186 } 187 188 } 189 } 190 191} 192

投稿2019/11/15 11:55

junzi

総合スコア279

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Damaku_ProG

2019/11/15 12:37

ご回答ありがとうございます。 おかげさまで、正常に動作しました。 もし、よろしければ詳しく教えていただきたいのですが、最初の数字の変数 i2 は変数宣言するとエラーが出るのに次の数字 k2は変数宣言してもエラーが出ないのはなぜでしょうか?
junzi

2019/11/15 13:10

定義した変数の有効範囲(スコープ)というものがありまして基本的には{}の中が有効範囲なのです。 166行目で定義したk2は同じカッコの中で使われています。 一方158行目で定義したi2は入力した値をいれて162行目の}で使わずに破棄(有効範囲終了)しています。 通常だと183行目でi2が破棄されているのでコンパイルエラーが出るのですが、40行目の static BigDecimal i2; //割り算用最初の数 これを参照しているので、コンパイルエラーに今回はなりませんでした。 ですが、40行目のi2はnullなので、実行するとヌルポが出ていたという所です。 i2.divide(k2)は 40行目のi2 ÷ 166行目のk2 となっています。 158行目のBigDecimal を消すと意味が変わってきて、新しく作らずに40行目のi2で作った変数にkazuを数字に変換して入れています。 ちなみに166行目のk2も、BigDecimal を消すと一旦41行目に値を入れて、そこから取り出す動きになります。 ダラダラとわかりずらい説明で申し訳ない!
Damaku_ProG

2019/11/15 13:40

たびたび質問に答えていただきありがとうございます。 staticで変数宣言した i2 が158行目で新たに i2を宣言し直してしまった為、btnWaru の else if内のカッコ内でしか適用しなくなってしまったみたいですね。 k2 は btnIkoru の else if のカッコ内の為、新たに宣言しても適用できたということですね。 スッキリしました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問