質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
Java

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

Q&A

1回答

800閲覧

JavaでNoSuchElementExceptionが出てしまう

aiue_minami

総合スコア1

Java

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

0グッド

0クリップ

投稿2023/01/19 12:29

前提

JavaでGUIでの電卓を作っています。
GUIから逆ポーランド記法に変換する過程か変換後,
計算を行う過程で,スタックでNoSuchElementExceptionが出てしまいます。
スタックに対してprintfデバッグを行いましたが,そもそも逆ポーランド記法に変換するコードがうまく動作しておらず明確な原因がつかめませんでした。
どなたかわかる方いれば教えていただけますでしょうか。
プログラミング初心者のため,分かりにくい箇所があったら申し訳ないです。

逆ポーランド記法変換方法は以下を,
http://7ujm.net/etc/calcstart.html

計算プログラムは以下を参考にしました。
https://qiita.com/Liberty/items/1811bc336fe31ae0c8da

実現したいこと

GUIから逆ポーランド記法に変換する動作
逆ポーランド記法に変換後,計算を行う動作

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

java.util.NoSuchElementException at java.util.ArrayDeque.removeFirst(ArrayDeque.java:285) at java.util.ArrayDeque.pop(ArrayDeque.java:522) at src.Dentaku.<init>(Dentaku.java:268) at src.Dentaku$1.run(Dentaku.java:38) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) at java.awt.EventQueue.access$500(EventQueue.java:97) at java.awt.EventQueue$3.run(EventQueue.java:709) at java.awt.EventQueue$3.run(EventQueue.java:703) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

該当のソースコード

java

1package src; 2import java.awt.EventQueue; 3import java.awt.GridLayout; 4import java.awt.event.ActionEvent; 5import java.awt.event.ActionListener; 6import java.util.ArrayDeque; 7import java.util.Deque; 8import java.util.HashMap; 9import java.util.Map; 10 11import javax.swing.JButton; 12import javax.swing.JFrame; 13import javax.swing.JPanel; 14import javax.swing.JTextArea; 15//電卓アルゴリズム↓ 16//ボタンを押したら文字列配列に逆ポーランド記法で書き出す(その時に逆ポーランド記法に書き出すためのルールがある) 17//1.数字を読んだ場合はそのまま出力する 18//2.演算子を読んだ場合はスタックの先頭と優先度を比較しスタックの先頭の優先度が低くなるまでスタックの内容を書き出す。 19// その後、読んだ演算子をスタックに積む 20//3.式が最後に到達したらスタックの中身をすべて書き出す 21//逆ポーランド記法で書いた式が入った文字列をキューをつかって計算する 22 23 24//電卓を動かすためのランする箇所 グローバル変数範囲ここで宣言? 25public class Dentaku extends JFrame { 26 Deque<String> kigou_stack = new ArrayDeque<String>();//記号を保存するスタック 27 StringBuilder sb = new StringBuilder();//逆ポーランド記法に直された文字列が入る 28 Deque<Double> que = new ArrayDeque<>();//逆ポーランド記法に並びなおされた文字列を計算するキュー 29 30 //List<String> suuji_list = new ArrayList<String>();//数字を保存するリスト 31 //float sum=(float) 0.0;//合計値を計算する 32 String stringArray=new String(); 33 34 private JPanel contentPane; 35 public static void main(String[] args) { 36 EventQueue.invokeLater(new Runnable() { 37 public void run() { 38 try { 39 Dentaku frame = new Dentaku(); 40 frame.setVisible(true); 41 } catch (Exception e) { 42 e.printStackTrace(); 43 } 44 } 45 }); 46 } 47 48 public Dentaku() { 49 50 //GUI表示を行うためのおまじない 51 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 52 setBounds(100, 100, 450, 300); 53 contentPane = new JPanel(); 54 //contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 55 contentPane.setLayout(new GridLayout(5, 4)); 56 setContentPane(contentPane); 57 58 59 60 //ボタンフェーズ----------------------------------------------------------- 61 JButton btn_1 = new JButton("1"); 62 btn_1.addActionListener(new ActionListener() { 63 public void actionPerformed(ActionEvent e) { 64 //suuji_list.append("1"); 65 sb.append("1"); 66 stringArray=stringArray + "1"; 67 } 68 }); 69 contentPane.add(btn_1); 70 71 JButton btn_2 = new JButton("2"); 72 btn_2.addActionListener(new ActionListener() { 73 public void actionPerformed(ActionEvent e) { 74 //suuji_list.append("2"); 75 sb.append("2"); 76 stringArray=stringArray + "2"; 77 } 78 }); 79 contentPane.add(btn_2); 80 81 JButton btn_3 = new JButton("3"); 82 btn_1.addActionListener(new ActionListener() { 83 public void actionPerformed(ActionEvent e) { 84 //suuji_list.append("1"); 85 sb.append("3"); 86 stringArray=stringArray + "3"; 87 } 88 }); 89 contentPane.add(btn_3); 90 91 JButton btn_4 = new JButton("4"); 92 btn_2.addActionListener(new ActionListener() { 93 public void actionPerformed(ActionEvent e) { 94 //suuji_list.append("2"); 95 sb.append("4"); 96 stringArray=stringArray + "4"; 97 } 98 }); 99 contentPane.add(btn_4); 100 JButton btn_5 = new JButton("5"); 101 btn_1.addActionListener(new ActionListener() { 102 public void actionPerformed(ActionEvent e) { 103 //suuji_list.append("1"); 104 sb.append("5"); 105 stringArray=stringArray + "5"; 106 } 107 }); 108 contentPane.add(btn_5); 109 110 JButton btn_6 = new JButton("6"); 111 btn_2.addActionListener(new ActionListener() { 112 public void actionPerformed(ActionEvent e) { 113 //suuji_list.append("2"); 114 sb.append("6"); 115 stringArray=stringArray + "6"; 116 } 117 }); 118 contentPane.add(btn_6); 119 120 JButton btn_7 = new JButton("7"); 121 btn_1.addActionListener(new ActionListener() { 122 public void actionPerformed(ActionEvent e) { 123 //suuji_list.append("1"); 124 sb.append("7"); 125 stringArray=stringArray + "7"; 126 } 127 }); 128 contentPane.add(btn_7); 129 130 JButton btn_8 = new JButton("8"); 131 btn_2.addActionListener(new ActionListener() { 132 public void actionPerformed(ActionEvent e) { 133 //suuji_list.append("2"); 134 sb.append("8"); 135 stringArray=stringArray + "8"; 136 } 137 }); 138 contentPane.add(btn_8); 139 JButton btn_9 = new JButton("9"); 140 btn_1.addActionListener(new ActionListener() { 141 public void actionPerformed(ActionEvent e) { 142 //suuji_list.append("1"); 143 sb.append("9"); 144 stringArray=stringArray + "9"; 145 } 146 }); 147 contentPane.add(btn_9); 148 149 JButton btn_0 = new JButton("0"); 150 btn_2.addActionListener(new ActionListener() { 151 public void actionPerformed(ActionEvent e) { 152 //suuji_list.append("2"); 153 sb.append("0"); 154 stringArray=stringArray + "0"; 155 } 156 }); 157 contentPane.add(btn_0); 158//記号----------------------------------------------------------------------------------- 159 JButton btn_plus = new JButton("+"); 160 btn_plus.addActionListener(new ActionListener() { 161 public void actionPerformed(ActionEvent e) { 162 163 while(kigou_stack !=null){//スタックが空ではないとき 164 if(kigou_stack.peek().equals("*") || kigou_stack.peek().equals("/"))//+よりも前に*や/があったらスタックは吐き出す 165 //suuji_list.append(kigou_stack.removeFIrst()); 166 sb.append(kigou_stack.removeFirst()); 167 } 168 if(kigou_stack ==null||kigou_stack.peek()=="-") 169 kigou_stack.addFirst("+"); 170 171 stringArray=stringArray + "+"; 172 } 173 174 }); 175 contentPane.add(btn_plus); 176 177 JButton btn_mainasu = new JButton("-"); 178 btn_mainasu.addActionListener(new ActionListener() { 179 public void actionPerformed(ActionEvent e) { 180 while(kigou_stack !=null){//スタックが空ではないとき 181 if(kigou_stack.peek().equals("*") || kigou_stack.peek().equals("/"))//+よりも前に*や/があったらスタックは吐き出す 182 //suuji_list.append(kigou_stack.removeFIrst()); 183 sb.append(kigou_stack.removeFirst()); 184 } 185 if(kigou_stack ==null||kigou_stack.peek()=="+") 186 kigou_stack.addFirst("-"); 187 188 stringArray=stringArray + "-"; 189 } 190 }); 191 contentPane.add(btn_mainasu); 192 193 194 195 JButton btn_kakeru = new JButton("*"); 196 btn_kakeru.addActionListener(new ActionListener() { 197 public void actionPerformed(ActionEvent e) { 198 kigou_stack.addFirst("*"); 199 200 stringArray=stringArray + "*"; 201 } 202 }); 203 contentPane.add(btn_kakeru); 204 205 JButton btn_per = new JButton("÷"); 206 btn_per.addActionListener(new ActionListener() { 207 public void actionPerformed(ActionEvent e) { 208 kigou_stack.addFirst("/"); 209 210 stringArray=stringArray + "÷"; 211 } 212 }); 213 contentPane.add(btn_per); 214 215 216 217 218 JButton btn_equal = new JButton("="); 219 btn_equal.addActionListener(new ActionListener() { 220 public void actionPerformed(ActionEvent e) { 221 double a = 0.0; 222 double b = 0.0; 223 String keisan=sb.toString(); 224 for (int i = 0; i < sb.length(); i++) { 225 switch (keisan.charAt(i)) { 226 case '+': 227 a = que.pollFirst(); 228 b = que.pollFirst(); 229 que.addFirst(b + a); 230 break; 231 case '-': 232 a = que.pollFirst(); 233 b = que.pollFirst(); 234 que.addFirst(b - a); 235 break; 236 case '/': 237 a = que.pollFirst(); 238 b = que.pollFirst(); 239 que.addFirst(b / a); 240 break; 241 case '*': 242 a = que.pollFirst(); 243 b = que.pollFirst(); 244 que.addFirst(b * a); 245 break; 246 default: 247 que.addFirst(Double.parseDouble(keisan)); 248 } 249 } 250 251 stringArray=stringArray + "1"; 252 } 253 254 255 }); 256 contentPane.add(btn_equal); 257 258 259 JButton btn_AC = new JButton("AC"); 260 btn_AC.addActionListener(new ActionListener() { 261 public void actionPerformed(ActionEvent e) { 262 kigou_stack = null; 263 sb = null; 264 que = null; 265 266 } 267 }); 268 contentPane.add(btn_AC); 269 Double a=que.pop(); 270 String str=String.valueOf(a); 271 JTextArea text = new JTextArea(str); 272 contentPane.add(text); 273 text.setLineWrap(true); 274 getContentPane().add(text); 275 276 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 277 setSize(530, 200); 278 setVisible(true); 279 280 281 282 283 } 284 285} 286

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

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

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

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

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

jimbe

2023/01/19 13:04 編集

teratail はデバッグを依頼する所ではありません。 どのような入力をして例外が発生したのでしょうか。 そもそもボタンの生成の所から、コピペして修正しきれていない部分がありますね。 また、キューが空になっても変数が null になることはありませんし、null にすることでキューが空になることもありません。
jimbe

2023/01/20 06:43

アルゴリズムに気を取られてコードそのものが見えていない感じがします。
guest

回答1

0

計算を行う過程で,スタックでNoSuchElementExceptionが出てしまいます。

エラー文や提示コードを見る限り、コンストラクタでのエラーではありませんか?(提示コードで言うと269行目)

Java

1Double a=que.pop();

どういう意図か読み取れませんが、この時点ではqueは空でしょうからエラーです。

GUIから逆ポーランド記法に変換する動作
逆ポーランド記法に変換後,計算を行う動作

GUIでは普通の入力(中置記法)を受け付けて、計算自体は逆ポーランドでするということですか?

Java

1// 中置記法から逆ポーランド記法に変換 2private static String toRpn(String formula) { /* 省略 */ } 3 4// 逆ポーランド記法を計算 5private static double calcRpn(String formula) { /* 省略 */ }

みたいなメソッドを作り、まずはコンソールプログラムで動作確認を取るのがいいと思います(確認が取れてからGUI化します)

その際はイコール以外のボタンは文字列に追加していくだけで、イコールでtoRpncalcRpnを呼べばいいように思います。

投稿2023/01/19 15:50

TN8001

総合スコア9396

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問