JAVA异常处理之重--项目实战经验

对于初学者来说,一听异常就老火,而且在写代码时,经常会被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);
						}
					}


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值