这是事情:
我有一个DB作为得分记录;
我有一个按钮,用新分数更新数据库;
我有一个“开发者异常”,只要分数低而无法替换记分板(DB)中的任何分数,就会抛出SQLException;
问题:
这是错误:
以下是按钮中的代码:
try
{
Connection conec=DriverManager.getConnection(hostname,username,password); //<-- Conecçao com a base de dados
Statement stm=conec.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); //<-- Conecção com as tabelas
//------------Aquisição dos dados------------------//
SQL="SELECT * FROM DEMOLION.MINER";
res=stm.executeQuery(SQL);
//-------------------------------------------------//
res.first();
nome=JOptionPane.showInputDialog("Introduza o mone que deseja registar:","Jogador1");
Desktop.getDesktop().open(new File("Jogos RPG Maker/Miner mapa/Game.exe"));
pontuacao=JOptionPane.showInputDialog("Introduza a pontuação obtida:","0");
pontos=Integer.parseInt(pontuacao);
do
{
pontos_insuf();
dbpontos=res.getInt("PONTUACOES");
System.out.println("pt="+pontos+"db="+dbpontos);
if(pontos>dbpontos)
{
res.updateInt("PONTUACOES",pontos);
res.updateString("NOME",nome);
res.updateRow();
}
if(pontos<dbpontos || pontos==dbpontos)
{
res.next();
}
}
while(pontos<dbpontos);
stm.close();
res.close();
}
catch (IOException ex)
{
Logger.getLogger(Jogos_Pacman.NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
}
catch(SQLException e)
{
MsgBox.show(e.getMessage(),"AVISO", JOptionPane.INFORMATION_MESSAGE);
}
这是开发者例外:
private void pontos_insuf() throws SQLException{
if(!res.next())
{
throw new SQLException("Obteve uma pontuação insuficiente para superar pontuações anteriores!");
} }
答案 0 :(得分:1)
您正在使用CONCUR_UPDATABLE创建您的声明,我猜测您的数据库需要锁定,但是当发生错误时您不会释放锁定,即您没有明确关闭声明。
最好的情况是你受GC支持收集声明并释放锁定,最坏的情况是它永远不会发生。
您需要做的是移动这些陈述:
stm.close();
res.close();
进入finally
块,以便无论发生什么