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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

Swing

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

Q&A

2回答

1408閲覧

更新データがない場合にエラーボックスを表示するようにしたい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

Swing

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

0グッド

0クリップ

投稿2020/03/31 05:31

以下のコードを実行して、更新データがない場合にエラーをはくようにしたいです。

public class Validate { private static final int ERROR_CODE_1030 = 1030; private static final String ERROR_MESSAGE_1030 = "更新対象のデータが存在しません。"; //更新データ存在チック public static int chkExistsUpdData(Connection con, String str) { PreparedStatement pstmt = null; ResultSet rs = null; try { // SQL文作成 String mySql = "select count(*) as naiyou from tbl.tbl_dbaccess where PID = ?;"; // ステートメントオブジェクトを作成 pstmt = con.prepareStatement(mySql); // 検索条件 pstmt.setInt(1, Integer.parseInt(str)); // 検索するSQL実行 rs = pstmt.executeQuery(); int count = 0; // 検索結果(件数) // 結果セットからデータを取り出す next()で次の行に移動 while(rs.next()) { count = rs.getInt("naiyou"); } // 検索結果件数チェック if(count == 0) { return ERROR_CODE_1030; } } catch (Exception ex) { System.out.println("例外発生:" + ex); ex.printStackTrace(); } finally { try { // 実行結果をクローズ if(rs != null) { rs.close(); } // ステートメントをクローズ if(pstmt != null) { pstmt.close(); } } catch (SQLException se) { // 何もしない } } return IS_SUCCESS_CODE; }
//更新 private class SwingAction_1 extends AbstractAction { public SwingAction_1() { putValue(NAME, "更新"); putValue(SHORT_DESCRIPTION, "Some short description"); } public void actionPerformed(ActionEvent e) { int row = table.getSelectedRow(); int col = table.getSelectedColumn(); Connection con = null; Statement stmt = null; ResultSet rs = null; try { // データベースに接続 Class.forName("com.mysql.cj.jdbc.Driver"); con=DriverManager.getConnection(STR_CONN); //入力文字内容チェック int chErrorCode = Validate.chkContents(textField.getText()); if(chErrorCode != Validate.getErrCode0()){ //エラーダイアログ表示 JOptionPane.showMessageDialog(frame, Validate.getErrMsg(chErrorCode)); } // 更新データ存在チェック int CerrorCode = Validate.chkExistsUpdData(con, String.valueOf(table.getValueAt(row, 1))); if(CerrorCode != Validate.getErrCode0()) { //エラーダイアログ表示(更新対象のデータが存在しません) JOptionPane.showMessageDialog(frame, Validate.getErrMsg(CerrorCode)); } // ステートメントオブジェクトを作成 stmt=con.createStatement(); // SQL文作成 String Sql = "UPDATE tbl_dbaccess SET NAIYOU='"+table.getValueAt(0,col)+"'WHERE PID='"+table.getValueAt(row, 0)+"'"; String sql2="select PID, NAIYOU as 内容 from tbl_dbaccess"; stmt.executeUpdate(Sql); rs=stmt.executeQuery(sql2); //System.out.println(Sql); //問い合わせ table.setModel(new MyTableModel(rs)); } catch(Exception r){r.printStackTrace();} finally { // 各オブジェクトを解放する if(stmt != null) { try { stmt.close(); }catch (Exception r) { System.out.println(r.getMessage()); } } if(con != null) try { con.close(); }catch (Exception r) { System.out.println(r.getMessage()); } } } }

現状以下のエラーが表示され先に進めていない状態です。
java.lang.ArrayIndexOutOfBoundsException: 1 >= 0
ご教示頂けますと幸いです。

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

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

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

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

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

jimbe

2020/04/01 07:42

> java.lang.ArrayIndexOutOfBoundsException: 1 >= 0 これが発生している行をスタックトレースから教えてください.
guest

回答2

0

まず, 「更新データがない」ことがあるのでしょうか.
前のご質問からすると, テーブルにはDBからのデータが並んでいるはずで, それを編集して更新しているはずです.

そして, Statement#executeUpdate() は処理した件数を返します.
キーである(と思われる) PID を条件にした UPDATE であれば, 成功すれば 1, 失敗すれば 0 となるのではないでしょうか.
ですので, UPDATE 前に SELECT で確認せずとも, UPDATE の実行結果からエラーを判定すれば良いのではと思います.

以下は(MySql 環境が無いので) DB を模して動作するモノです.
更新はボタン操作でなくテーブルの「内容」の編集後に自動で行い, 再表示も自動ですので表示ボタンもありません. (PID は編集不可としています.)
登録ボタンは入力内容に文字列がある場合のみ有効, 削除ボタンは行を選択している場合のみ有効とする等で, エラーになる状況を減らしています.
(MySql にアクセスするクラスも作ってはあるのですが, 動かしていないことと文字数制限に掛かるので入れていません.)

java

1package teratail.q250457; 2//package DBaccess; 3 4import java.awt.*; 5import java.awt.event.ActionEvent; 6import java.sql.SQLException; 7import java.util.*; 8import java.util.List; 9 10import javax.swing.*; 11import javax.swing.border.EmptyBorder; 12import javax.swing.event.*; 13import javax.swing.table.AbstractTableModel; 14 15public class DBAccess extends JFrame implements DatabaseExceptionProcessor { 16 17 public static void main(String[] args) { 18 SwingUtilities.invokeLater(new Runnable() { 19 public void run() { 20 try { 21 new DBAccess().setVisible(true); 22 } catch(Exception e) { 23 e.printStackTrace(); 24 } 25 } 26 }); 27 } 28 29 private DatabaseAccessor dba; 30 private JTable table; 31 32 public DBAccess() throws ClassNotFoundException, SQLException { 33 super("DBアクセスプログラム"); 34 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 35 setBounds(100, 100, 450, 300); 36 setLocationRelativeTo(null); 37 38 //dba = new MysqlDatabaseAccessor(this); 39 dba = new DummyDatabaseAccessor(); 40 table = new JTable(dba.selectAll()); 41 42 JTextField textField = new JTextField(); 43 textField.setColumns(10); 44 textField.setAlignmentX(JLabel.LEFT_ALIGNMENT); 45 46 InsertAction insertAction = new InsertAction(textField); 47 DeleteAction deleteAction = new DeleteAction(); 48 49 JPanel contentPane = new JPanel(); 50 contentPane.setLayout(new BorderLayout()); 51 contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 52 setContentPane(contentPane); 53 54 Box northPanel = Box.createVerticalBox(); { 55 JPanel buttonsPanel = new JPanel(new FlowLayout()); 56 buttonsPanel.setAlignmentX(JLabel.LEFT_ALIGNMENT); { 57 buttonsPanel.add(new JButton(insertAction)); 58 buttonsPanel.add(new JButton(deleteAction)); 59 } 60 northPanel.add(buttonsPanel); 61 northPanel.add(createLabel("入力内容")); 62 northPanel.add(textField); 63 northPanel.add(createLabel("表示内容")); 64 } 65 contentPane.add(northPanel, BorderLayout.NORTH); 66 contentPane.add(new JScrollPane(table), BorderLayout.CENTER); 67 68 table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 69 table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { 70 @Override 71 public void valueChanged(ListSelectionEvent e) { 72 int pid = -1; 73 int index = table.getSelectedRow(); 74 if(index >= 0) { 75 index = table.convertRowIndexToModel(index); 76 pid = ((MyTableModel)table.getModel()).getPid(index); 77 } 78 deleteAction.setTarget(pid); 79 } 80 }); 81 table.clearSelection(); 82 } 83 private JLabel createLabel(String text) { 84 JLabel label = new JLabel(text); 85 label.setAlignmentX(JLabel.LEFT_ALIGNMENT); 86 return label; 87 } 88 89 private class InsertAction extends AbstractAction { 90 private JTextField textField; 91 public InsertAction(JTextField textField) { 92 putValue(NAME, "登録"); 93 setEnabled(false); 94 this.textField = textField; 95 textField.getDocument().addDocumentListener(new DocumentListener() { 96 @Override 97 public void removeUpdate(DocumentEvent e) { checkEnable(); } 98 @Override 99 public void insertUpdate(DocumentEvent e) { checkEnable(); } 100 @Override 101 public void changedUpdate(DocumentEvent e) { checkEnable(); } 102 void checkEnable() { 103 InsertAction.this.setEnabled(textField.getText().length() > 0); 104 } 105 }); 106 } 107 @Override 108 public void actionPerformed(ActionEvent ae) { 109 String text = textField.getText(); 110 if(dba.insert(text) == 1) { 111 table.setModel(dba.selectAll()); 112 textField.setText(""); //クリア 113 } 114 } 115 } 116 117 private class DeleteAction extends AbstractAction { 118 private int pid; 119 DeleteAction() { 120 putValue(NAME, "削除"); 121 setEnabled(false); 122 } 123 void setTarget(int pid) { 124 this.pid = pid; 125 setEnabled(pid >= 0); 126 } 127 @Override 128 public void actionPerformed(ActionEvent ae) { 129 if(dba.delete(pid) == 1) { 130 table.setModel(dba.selectAll()); 131 } 132 } 133 } 134 135 @Override 136 public void receiveException(SQLException e) { 137 JOptionPane.showMessageDialog(this, e.getMessage()); 138 e.printStackTrace(); 139 } 140} 141 142class MyTableModel extends AbstractTableModel { 143 private String[] columnNames = new String[] { "PID", "内容"}; 144 private static class Row { 145 final Integer pid; 146 final String naiyou; 147 Row(int pid, String naiyou) { 148 this.pid = pid; 149 this.naiyou = naiyou; 150 } 151 } 152 private List<Row> rows = new ArrayList<>(); 153 private DatabaseAccessor dba; 154 155 MyTableModel(DatabaseAccessor dba) { 156 this.dba = dba; 157 } 158 159 void addRow(int pid, String naiyou) { 160 rows.add(new Row(pid, naiyou)); 161 fireTableRowsInserted(rows.size()-1, rows.size()-1); 162 } 163 int getPid(int rowIndex) { 164 return rows.get(rowIndex).pid; 165 } 166 167 @Override 168 public String getColumnName(int columnIndex) { 169 return columnNames[columnIndex]; 170 } 171 @Override 172 public int getRowCount() { 173 return rows.size(); 174 } 175 @Override 176 public int getColumnCount() { 177 return columnNames.length; 178 } 179 @Override 180 public Object getValueAt(int rowIndex, int columnIndex) { 181 if(columnIndex == 0) return rows.get(rowIndex).pid; 182 if(columnIndex == 1) return rows.get(rowIndex).naiyou; 183 return null; 184 } 185 @Override 186 public boolean isCellEditable(int rowIndex, int columnIndex) { 187 return columnIndex == 1; 188 } 189 @Override 190 public void setValueAt(Object value, int rowIndex, int columnIndex) { 191 rows.set(rowIndex, new Row(rows.get(rowIndex).pid, (String)value)); 192 fireTableCellUpdated(rowIndex, columnIndex); 193 if(dba != null) dba.update(rows.get(rowIndex).pid, (String)value); 194 } 195} 196 197interface DatabaseExceptionProcessor { 198 void receiveException(SQLException e); 199} 200interface DatabaseAccessor { 201 MyTableModel selectAll(); 202 int insert(String text); 203 int update(int pid, String text); 204 int delete(int pid); 205} 206class DummyDatabaseAccessor implements DatabaseAccessor { 207 private static String TEST[] = {"ABC","あいう","123"}; 208 private int nextPid = 0; 209 private Map<Integer,String> rows = new TreeMap<Integer, String>(); 210 DummyDatabaseAccessor() { 211 for(String s : TEST) rows.put(nextPid++, s); 212 } 213 @Override 214 public MyTableModel selectAll() { 215 MyTableModel tableModel = new MyTableModel(this); 216 for(Map.Entry<Integer,String> entry : rows.entrySet()) { 217 tableModel.addRow(entry.getKey(), entry.getValue()); 218 } 219 return tableModel; 220 } 221 @Override 222 public int insert(String text) { 223 System.out.println("insert text="+text); 224 rows.put(nextPid++, text); 225 return 1; 226 } 227 @Override 228 public int update(int pid, String text) { 229 System.out.println("update pid="+pid+", text="+text); 230 if(!rows.containsKey(pid)) return 0; 231 rows.put(pid, text); 232 return 1; 233 } 234 @Override 235 public int delete(int pid) { 236 System.out.println("delete pid="+pid); 237 if(!rows.containsKey(pid)) return 0; 238 rows.remove(pid); 239 return 1; 240 } 241}

投稿2020/03/31 15:37

編集2020/03/31 15:44
jimbe

総合スコア12545

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

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

0

表題更新データがない場合にエラーボックスを表示するようにしたいと、訊きたいこと現状以下のエラーが表示され先に進めていない状態ですに齟齬がありすぎて、まるで理解できません。なので、表題に関することだけ。

エラーボックスとは、ダイアログボックスのことと想像しました。ダイアログボックスを表示するには、JOptionPaneが使えます。そのサンプルです。

java

1package xx; 2 3import javax.swing.*; 4import java.awt.*; 5import java.io.ByteArrayOutputStream; 6import java.io.PrintStream; 7 8public class Hogege { 9 public static final void main(final String[] args) throws Exception { 10 SwingUtilities.invokeLater(() -> { 11 final MainWindow frame = new MainWindow(); 12 frame.setVisible(true); 13 }); 14 } 15 16 static class MainWindow extends JFrame { 17 MainWindow() { 18 super(); 19 setLayout(new FlowLayout()); 20 21 final Button doExceptionButton = new Button("do exception"); 22 add(doExceptionButton); 23 doExceptionButton.addActionListener(ev -> { 24 try { 25 doSometing(); 26 } catch (Exception e) { 27 JOptionPane.showMessageDialog( 28 doExceptionButton, 29 dumpException(e), 30 e.getMessage(), 31 JOptionPane.ERROR_MESSAGE); 32 } 33 }); 34 35 setTitle(this.getClass().getName()); 36 setSize(400, 400); 37 } 38 39 void doSometing() throws Exception { 40 throw new Exception("うだうだ、ぐだぐだ、うだうだ、ぐだぐだ"); 41 } 42 43 private String dumpException(Exception e) { 44 final ByteArrayOutputStream baos = new ByteArrayOutputStream(); 45 final PrintStream ps = new PrintStream(baos); 46 e.printStackTrace(ps); 47 ps.close(); 48 return baos.toString(); 49 } 50 } 51}

投稿2020/03/31 09:33

編集2020/03/31 09:36
shiketa

総合スコア3971

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

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

jimbe

2020/03/31 11:14

データが無い場合にその旨を(エラーとして)表示したいが, コードに問題があって例外(エラー?)が出てしまうということではないでしょうか.
shiketa

2020/03/31 13:34

きっとそうなのだろうともおもいましたが、あえて表題側を摂りました。 ArrayIndexOutOfBoundsExceptionが発生しているのだから、見えている範囲では`getValueAt()`のどれかがおかしいのだろうと思えますが、実は見せてもらえていない部分かもしれませんし。 kakei2794さん。 実行はできているようなので、例外をキャッチする場所すべてでエラーボックスを表示すれば、StackTraceも表示されるでしょうから、具体的にどこでArrayIndexOutOfBoundsExceptionが発生しているのかヒントがつかめるかもしれませんよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問