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

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

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

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

Swing

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

Q&A

解決済

3回答

4871閲覧

ボタンをクリックしたらエラーがでました

Alpa

総合スコア80

Java

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

Swing

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

0グッド

0クリップ

投稿2017/12/16 06:03

タイマーを作成しようと思いボタンでスタート&ストップ&リセットをしようと思ったのですが
エラーが発生しました
どうしたらいいのでしょうか?
時間の処理にはSwingのTimerを使用しています

以下はエラー文です

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at timer.actionPerformed(Timer.java:119) at javax.swing.Timer.fireActionPerformed(Unknown Source) at javax.swing.Timer$DoPostEvent.run(Unknown Source) at java.awt.event.InvocationEvent.dispatch(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$500(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

以下はコードです

java

1import javax.swing.*; 2import java.awt.*; 3import java.awt.event.*; 4 5class timer extends JFrame implements ActionListener{ 6 7 JPanel panel; 8 9 JLabel t; 10 11 JButton start; 12 JButton stop; 13 JButton clear; 14 15 public static final String Cmd_start = "start"; 16 public static final String Cmd_stop = "stop"; 17 public static final String Cmd_clear = "clear"; 18 19 Timer ti; 20 21 int T1 = 0; 22 int T2 = 0; 23 int T3 = 0; 24 int T4 = 0; 25 26 public static void main(String args[]){ 27 28 timer Frame = new timer(); 29 30 Frame.setSize(300, 100);//ウィンドウサイズ設定 31 Frame.setTitle("タイマー"); 32 Frame.setLocationRelativeTo(null);//ウィンドウの位置を中央に設定 33 Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//ウィンドウを×で閉じるようにする設定 34 Frame.setVisible(true);//ウィンドウを可視化 35 36 } 37 38 timer(){ 39 40 ti = new Timer(1000, this); 41 42 start = new JButton("スタート"); 43 stop = new JButton("ストップ"); 44 clear = new JButton("リセット"); 45 46 start.setForeground(Color.BLACK); 47 start.setBackground(Color.WHITE); 48 stop.setForeground(Color.BLACK); 49 stop.setBackground(Color.WHITE); 50 clear.setForeground(Color.BLACK); 51 clear.setBackground(Color.WHITE); 52 53 start.setVerticalAlignment(JButton.CENTER); 54 start.setHorizontalAlignment(JButton.CENTER); 55 stop.setVerticalAlignment(JButton.CENTER); 56 stop.setHorizontalAlignment(JButton.CENTER); 57 clear.setVerticalAlignment(JButton.CENTER); 58 clear.setHorizontalAlignment(JButton.CENTER); 59 60 start.setBounds(0, 0, 50, 30); 61 stop.setBounds(60, 0, 50, 30); 62 clear.setBounds(110, 0, 50, 30); 63 64 start.setActionCommand(Cmd_start); 65 stop.setActionCommand(Cmd_stop); 66 clear.setActionCommand(Cmd_clear); 67 68 start.addActionListener(this); 69 stop.addActionListener(this); 70 clear.addActionListener(this); 71 72 panel = new JPanel(); 73 panel.setLayout(null); 74 75 t = new JLabel(); 76 t.setText(T1 + "日" + T2 + "時" + T3 + "分" + T4 + "秒"); 77 t.setBounds(0, 0, 100, 100); 78 79 panel.add(t); 80 81 panel.add(start); 82 panel.add(stop); 83 panel.add(clear); 84 85 getContentPane().add(panel, BorderLayout.CENTER); 86 87 } 88 89 public void actionPerformed(ActionEvent e){ 90 91 String cmd = e.getActionCommand(); 92 93 if(cmd.equals(Cmd_start)){ 94 95 ti.start(); 96 97 }else if(cmd.equals(Cmd_stop)){ 98 99 ti.stop(); 100 101 }else if(cmd.equals(Cmd_clear)){ 102 103 T1 = 0; 104 T2 = 0; 105 T3 = 0; 106 T4 = 0; 107 108 } 109 110 T4 += 1; 111 112 if(T4>= 60){ 113 114 T3 += 1; 115 T4 = 0; 116 117 } 118 119 if(T3 >= 60){ 120 121 T2+= 1; 122 T3 = 0; 123 124 } 125 126 if(T2 >= 24){ 127 128 T1+= 1; 129 T2 = 0; 130 131 } 132 133 t.setText(T1 + "日" + T2 + "時" + T3 + "分" + T4 + "秒"); 134 repaint(); 135 136 } 137 138}

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

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

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

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

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

karamarimo

2017/12/16 06:46

私に回答依頼が来てますが間違いだと思います。前にも同じことがありましたが、似た名前の方がいるんでしょうか?
guest

回答3

0

回答自体は既に出ているようですので、そこにたどり着く方法を記述したいと思います。

大事なのはエラーメッセージです。

今回のメッセージでは、最初に
java.lang.NullPointerException
とありますので、nullポインター例外が発生しているとわかります。

このとき、例外の意味がわからなければ例外をキーワードにして、検索しておきます。

次に、atから始まる行が複数記述されていますが、これは例外が発生した場所を示しています。

例えば、

at A
at B
at C

だったなら、Cが実行され、その中でBが呼ばれ、さらにBからAが呼ばれ、最終的にAで例外が発生したことを示しています。

今回ならば、
at timer.actionPerformed(Timer.java:119)
とあるので、最終的には、
Timer.javaの119行目、actionPerformedメソッド
で例外が発生したということです。

Timer.javaの119行目というのがどこになるのかは、このソースだけでは断定できませんが、
テキストエディターなどでソースコードを見れば、場所はすぐにわかるはずです。

まあ、恐らく

if(cmd.equals(Cmd_start)){

の箇所ではないかと思います。(ここであると仮定し、話を進めます)

今までの情報から、

if(cmd.equals(Cmd_start)){

の箇所で

NullPointerException

が発生したということがわかります。

NullPointerExceptionというのは、値の設定されていないオブジェクト変数に対して、操作した時に発生しますので、変数cmdがnullなのではないかと推測できます。

推理できたら、確証を得るために、例外が発生する前に、変数cmdの内容を表示するコードを追加し、テストしてみます。

このような流れでいけば、原因に辿りつけたのではないかと思います。

重要なのは、エラーメッセージをよく読むことです。

投稿2017/12/16 07:01

ngsvx

総合スコア287

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

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

0

書いてみた

ちょっと見かねてコードを抜本的に書き直してみました。MyTimer on Gist
次のようなファイル構成でコンパイル・実行できます。

plain

1mytimer/ 2 ┝ MyTimer.java (エントリーポイント) 3 ┝ gui/ 4 │ ┝ GUI.java 5 │ ┝ ButtonPanel.java 6 │ └ TimePanel.java 7 └ util/ 8 └ TimeCount.java

実行イメージ

ただ、私自身日頃からSwingを使っているわけではありません。
提示したサンプルコードの中でも、良くない点がきっとあるかと思います。
色んな人のコードを見て、良い部分を吸収してください。

気になる点

miyabi6184さんのコードを見て気になったのは、以下の点です。

  • 命名規則がぐちゃぐちゃ

クラス名はPascalCase、変数名はcamelCaseにするのが一般的です。
完全にその一般則に逆行しています。timer Frame = new timer();

  • 命名が細かいところで適当

適切に命名できている部分もありますが、
いったい何を指しているか全くわからない変数がちらほらあります。JLabel t;

  • クラスの役割が大きすぎる

これは慣れのようなものもありますが... 色んなコードを見て技術を盗んでください。
ある程度きれいなコードを書こうとすると、えてして行数やファイル数は増えるものです。

  • 同じ処理を書きすぎ

同じようなボタンをたくさん作るならば、クラス化した方が良いでしょう。

  • 変数のスコープが広すぎ

ローカル変数で構わないんじゃないか、という変数がちらほら。

  • コンポーネントの位置を手動で設定している

適切なサイズ(PreferedSize)を設定してレイアウトマネージャに任せましょう。

以前の回答についても再確認してみると良いでしょう。
teratail - if文の分岐がうまくいかない

エラーが出てから毎回修正するのは、そろそろ大変になってきていませんか?
そろそろ、『エラーの潰し方』ではなく『エラーを作らない方法』を探求してはいかがですか。

投稿2017/12/16 13:41

編集2017/12/16 14:05
LouiS0616

総合スコア35660

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

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

0

ベストアンサー

Java

1 String cmd = e.getActionCommand();

タイマー更新時に、上記箇所でe.getActionCommand()がnullを返しています。

そのため、以下のようにTimerにもコマンドの文字列を設定する必要があります。

Java

1 public static final String Cmd_countup = "countup"; 2 3 // …(中略) 4 5 timer(){ 6 7 ti = new Timer(1000, this); 8 ti.setActionCommand(Cmd_countup); 9 10 // …(中略) 11 }

投稿2017/12/16 06:31

fiveHundred

総合スコア9803

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

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

Alpa

2017/12/16 08:13

回答ありがとうございます 自分で他の方が言われている通りデバックしてみれば わかることでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問