前提・実現したいこと
Javaで課題に取り組んでいます。
コンパイルは通ったのですが、以下のエラーメッセージが発生しました。
このソースで何が原因でエラーが発生しているのか。解決方法も教えていただきたいです。
発生している問題・エラーメッセージ
Exception in thread "main" java.lang.NullPointerException: Cannot store to object array because "this.lbl" is null at MyPanel.<init>(Report3_2.java:38) at Report3_2.main(Report3_2.java:12)
該当のソースコード
JAVA
1/**/ 2import java.awt.*; 3import java.awt.event.*; 4import javax.swing.*; 5 6class Report3_2 { 7 public static void main(String[] args){ 8 JFrame frame = new JFrame("Report3_2"); 9 frame.getContentPane().setPreferredSize(new Dimension(500,200)); 10 frame.pack(); 11 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 12 MyPanel panel = new MyPanel(); 13 frame.add(panel); 14 frame.setVisible(true); 15 } 16} 17 18class MyPanel extends JPanel implements ActionListener { 19/* フィールド変数 */ 20 JButton btnRan,btnErase; 21 JPanel north,center; 22 JLabel[] lbl; 23 JLabel bun; 24 boolean hasTargetNumber; 25/* コンストラクタ */ 26 MyPanel(){ 27 /*hasTargetNumberの初期化*/ 28 /* 画面の背景色・レイアウト */ 29 setBackground(Color.lightGray); 30 setLayout(new BorderLayout()); 31 /* [乱数の生成]ボタン作成 */ 32 this.btnRan = new JButton("乱数の生成"); 33 /* [画面クリア]ボタン作成 */ 34 this.btnErase = new JButton("画面クリア"); 35 /* 乱数ラベル作成,空のラベル部品を作る*/ 36 JLabel[] lbl = new JLabel[40]; 37 for(int i = 0; i < 20; i++){ 38 this.lbl[i] = new JLabel(""); 39 } 40 /*[注釈]ラベル作成*/ 41 this.bun = new JLabel(""); 42 /*centerパネルを作る*/ 43 this.center = new JPanel(); 44 this.center.setLayout(new GridLayout(5,4)); 45 for(int i = 0; i < 20; i++){ 46 /*"ここが38行目!"*/this.center.add(this.lbl[i]); 47 } 48 /*northパネルを作る*/ 49 this.north = new JPanel(); 50 this.north.setLayout(new GridLayout(2,1)); 51 this.north.add(this.btnRan); 52 this.north.add(this.bun); 53 /* MyPanel(BorderLayout)にGUI部品をaddしていく */ 54 setLayout(new BorderLayout( )); 55 add (this.north, BorderLayout.NORTH); 56 add(this.center, BorderLayout.CENTER); 57 add (this.btnErase, BorderLayout.SOUTH); 58 } 59 60 @Override 61 public void actionPerformed(ActionEvent e){ 62 if ( e.getSource().equals(this.btnRan) ){ 63 this.bun.setHorizontalAlignment(JLabel.CENTER); 64 this.bun.setForeground(Color.blue); 65 this.bun.setText("生成した乱数は以下のとおりです"); 66 /*乱数の生成*/ 67 int[] ranNum = new int[20]; 68 for(int i = 0; i < 20; i++){ 69 ranNum[i] = (int)(Math.random()*10000); 70 if(hasTargetNumber(ranNum[i])){ 71 this.lbl[i].setForeground(Color.red); 72 String ranStr = String.valueOf(ranNum[i]); 73 this.lbl[i].setText(ranStr); 74 } 75 else{ 76 this.lbl[i].setForeground(Color.black); 77 String ranStr = String.valueOf(ranNum[i]); 78 this.lbl[i].setText(ranStr); 79 } 80 } 81 82 } 83 else if ( e.getSource().equals(this.btnErase) ){ 84 this.bun.setText(""); 85 for(int i = 0; i < 20; i++){ 86 this.lbl[i].setText(""); 87 } 88 } 89 } 90 91 /* 3または7を含んでいたらtrueを、そうでなければ 92 * falseを返す 93 */ 94 boolean hasTargetNumber(int number){ 95 int judge = 0; 96 String ranStr = String.valueOf(number); 97 for(int i=0; i < ranStr.length(); i++){ 98 char num = ranStr.charAt(i); 99 if(num == '3' || num == '7' ){ 100 judge = 1; 101 } 102 else{ 103 } 104 } 105 if(judge == 1){ 106 return true; 107 } 108 else{ 109 return false; 110 } 111 } 112} 113 114
補足情報(FW/ツールのバージョンなど)
コンパイルソフト
Cmder.exe