对于初学者来说,一听异常就老火,而且在写代码时,经常会被IDE提示没有处理异常,看着红叉就不爽的感觉,有木有?!
咱且暂不说异常机制原理,这东西网上一搜一大把,想了解的可以看看,在这我只想通过实际情况来说下异常的重要及使用。
1、两个概念组
Exception和Error
嘛是异常? 异常是程序运行过程中出现的错误。异常是Exception,错误是Error。其实,就这两个名字,我也纠结过一段时间,尤其是在初学的时候,明明都是错误,为什么一个Exception,一个是Error呢?不用深究,记住两点:它们的父亲都是Throwable类;Error是程序无法处理的,Exception是程序可以处理的。这可以理解成出了Error,你的程序就不会再跑了(专业点:JVM会终止线程);出了Exception,你的程序可以继续执行。
运行时异常和非运行时异常
看名字就知道啥意思了。简单来理解,运行时异常是你看到程序在跑以后出现的异常(特别注意IDE中console出现的红色东东);非运行时异常就是你在编译的时候跑出来的,你不处理它你程序就不能编译通过。简单点,记住运行时异常经常的:NullPointerException、 IndexOutOfBoundsException等。其他你没见过的,你就当它是非运行时异常。但是,最重要的一点记住,运行时异常你可以凭你心情,想解决就解决,不想弄就别管,只要不妨碍你程序功能;但是非运行时异常是必须要处理的(嘿嘿,当我废话,应该是不得不处理,不处理咋跑程序???)
2、实战感悟
实例:假想,你要往一个数据库中插入大量数据,可能是成千上万甚至几十几百万,这也就意味着你的程序会跟数据库建立大量连接,偶尔会出现暂时获取不到数据库连接的异常,如:
java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
The Connection descriptor used by the client was:
localhost:1521:orcl
(不考虑程序健壮性的情况下,因为利用线程和增加数据库进程数也是可以解决这个问题的)这个时候,如果出现了运行时异常时,你不处理嘛,肯定意味着数据丢失;你处理嘛,以前的工作白做了。最好的办法就是对异常进行处理,让其一定要获取到连接,执行完你要执行的语句。
两种代码如下:
没处理的,会丢失数据或者让我抓狂的:
异常由后台数据库执行操作产生
public ResultSet executeQuery(String sqlStr) { if (sqlStr == null || sqlStr.length() == 0) return null; try { this.getConnection(); rs = stmt.executeQuery(sqlStr); return rs; } catch (SQLException ex) { ex.printStackTrace(); System.out.println(sqlStr+"执行失败---"+System.currentTimeMillis()); return null; } }
for (int k = 0; k < result.size(); k++) { String sql = "insert into ssqred" + i + " (id,kjyear,red,fc,fccount) values('"; String id = result.get(k).toString(); String uuid = UUID.randomUUID().toString(); sql += uuid + "','" + kjyear + "','" + id.split("=")[0] + "','" + j + "','" + id.split("=")[1] + "')"; (jdbc.executeQuery(sql); }
处理了的,不管你报不报这异常(这种异常,我现在就是不想解决你),我启动程序可以不管它了,因为虽然你出现异常了,但是我对你进行了处理,我能保证我的代码继续正常运行,而且不丢失数据。
for (int k = 0; k < result.size(); k++) { String sql = "insert into ssqred" + i + " (id,kjyear,red,fc,fccount) values('"; String id = result.get(k).toString(); String uuid = UUID.randomUUID().toString(); sql += uuid + "','" + kjyear + "','" + id.split("=")[0] + "','" + j + "','" + id.split("=")[1] + "')"; boolean flag = false; while (!flag) { flag = (jdbc.executeQuery(sql) != null); } }