こんにちは。当方java初心者です。
eclipseで電卓のプログラムを作ってみたのですが、コンパイルする際に
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 14
at Keypad.<init>(Calculator.java:81)
at Calculator.<init>(Calculator.java:24)
at Calculator.main(Calculator.java:39)
とエラーがでました。
81、24、39行目に何かミスがあったのかな?と思いましたが、自分ではどこが間違っているのか全くわからない状態です・・・
・なにが間違っているのか
・どうしたらコンパイルが通るのか
の、2点をお聞きしたいです。
初心者ゆえわかりにく文章での質問申し訳ありませんが、回答してくださると嬉しいです。
ソースです。↓
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Calculator extends Frame
{
private Display out;
private Keypad in;
private Maths sums;
public Calculator()
{
setLayout(new BorderLayout());
out = new Display();
sums = new Maths(out);
in = new Keypad(out);
add("North", out);
add("Center", in);
add("East", sums);
this.addWindowFocusListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
public static void main(String[] args)
{
Frame f = new Calculator();
f.setSize(100, 200);
f.setVisible(true);
}
}
class Display extends Panel
{
private TextField show;
public Display()
{
show = new TextField(10);
Panel p = new Panel();
p.add(show);
add("Center", p);
}
public void write(String s)
{
show.setText(s);
}
public String read()
{
return show.getText();
}
}
class Keypad extends Panel implements ActionListener
{
private Display monitor;
public Keypad(Display myMonitor)
{
monitor = myMonitor;
Panel p = new Panel();
p.setLayout(new GridLayout(5, 3));
String[] buttonLabels = {"0","1","2","3","4","5","6","7","8","9",".","","","C"};
Button[] buttons = new Button[15];
for (int i = 0; i <= 14; i++)
{
buttons[i] = new Button(buttonLabels[i]);
buttons[i].addActionListener(this);
p.add(buttons[i]);
}
add("Center", p);
}
public void actionPerformed(ActionEvent e)
{
char c = e.getActionCommand().charAt(0);
switch(c)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
monitor.write(monitor.read()+c);
break;
case 'C':
monitor.write("");
break;
}
}
}
class Maths extends Panel implements ActionListener
{
private Display monitor;
private double num1, num2, result;
private char operand;
public Maths(Display myMonitor)
{
monitor = myMonitor;
Panel p = new Panel();
p.setLayout(new GridLayout(5, 1));
String[] buttonLabels = {"+","-","*","/","="};
Button[] buttons = new Button[5];
for (int i = 0; i <= 4; i++)
{
buttons[i] = new Button(buttonLabels[i]);
buttons[i].addActionListener(this);
p.add(buttons[i]);
}
add("North", p);
}
public void actionPerformed(ActionEvent e)
{
char c = e.getActionCommand().charAt(0);
switch(c)
{
case '+':
case '*':
case '-':
case '/':
num1 = Double.valueOf(monitor.read()).doubleValue();
operand = c;
monitor.write("");
break;
case '=':
num2 = Double.valueOf(monitor.read()).doubleValue();
result = sum(num1, num2, operand);
monitor.write(String.valueOf(result));
}
}
public double sum(double x, double y, char z)
{
double answer = 0;
if(z == '+')answer = x+y;
else if(z == '-') answer = x-y;
else if(z == '*') answer = x*y;
else if(z == '/') answer = x/y;
return answer;
}
}
No.1ベストアンサー
- 回答日時:
String[] buttonLabels = {"0","1","2","3","4","5","6","7","8","9",".","","","C"};
Button[] buttons = new Button[15];
for (int i = 0; i <= 14; i++)
{
buttons[i] = new Button(buttonLabels[i]);
// ...
}
さて、buttonLabels にはいくつ要素があって、その一番最後の要素にアクセスするには添え字はいくつにすればいいでしょう?(思い込みを外して数えてみましょう)
そしてその値を超えて buttonLabels にアクセスしているところは本当にありませんか?
回答ありがとうございます。
できました!!
なんて初歩的なミスをしてしまったのでしょうか・・・
初心者とはいえお恥ずかしいです。
「思い込みを外して数えてみましょう」のお言葉、大変痛感いたしました。
これからプログラミングする際にも肝に銘じておきたいと思います。
本当にありがとうございました!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java java final 1 2022/06/10 22:49
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
importするには java.io.*; imp...
-
【JAVAエラー】互換性のない型...
-
フレームの×ボタンを押しても閉...
-
「例外 *** は対応する try 文...
-
なんかエラーがでた
-
eclipseに記述したjavaファイル...
-
nextDoubleが使えない?
-
Javaで改行などが出来ないのです。
-
IF関数でEmpty値を設定する方法。
-
Javaで電卓を作りたい
-
応用情報技術者試験の令和元年...
-
論理演算子”||”またはの入力方法
-
ダブルクォーテーションのrepla...
-
Javaでお絵描きソフトを作りた...
-
byte[] を long,float とかに...
-
VBSエラー"オブジェクト型の変...
-
javaです。1月1日から日数入れ...
-
ArrayListの要素数の上限
-
ページング
-
パソコンキーボードで時分秒を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「例外 *** は対応する try 文...
-
eclipseに記述したjavaファイル...
-
<forEach> 内で供給された "ite...
-
setAttribute(String, int)は適...
-
干支の計算で。。。
-
Javaを使ってデジタル時計を作...
-
HTMLでのTableタグデータ取得方法
-
importするには java.io.*; imp...
-
生年月日と今日の日付から年齢...
-
文字列を数式に
-
シャットダウンフックが呼ばれない
-
Javaで常駐するソフトを作って...
-
フレームの×ボタンを押しても閉...
-
Selenium IDEでexportしたコー...
-
文字サイズが可変のラベル
-
jFrameを使って複数の画面を生...
-
【java】検索フォームの検索結...
-
Java での グローバルIP取得
-
(急募)JavaカレンダーをGUI可に...
-
gccにおけるimport
おすすめ情報