Java基础之Throwable,文件加载
Java中的异常与错误都继承自Throwable,Exception又分为运行时异常(RuntimeException)和编译时异常。
运行时异常是程序的逻辑不够严谨或者特定条件下程序出现了错误,例如做除法运算时除数为0,运行时异常Java是不要求一定去try,catch进行捕获的。我们调试代码要减少的就是运行时异常,随着代码的调试运行时异常被捕获,程序的健壮性也就得到了提升。
编译时异常例如文件未找到异常,IO异常,SQLException等,这些是可以预知的异常(checked Exception),不像运行时异常是unchecked Exception。我们的代码中进行文件读取,IO操作时就必须对这些异常进行捕获并做相应的处理。
异常捕获后最起码的操作是记录日志,做到有据可查。必要时要抛出异常,让上层调用的代码知道这里已经出现了异常。
方法中抛出新的异常用的是throw,方法声明抛出异常用的是throws,这也是要注意的。throw之后的代码都是不会执行的,会直接到catch或者finally中。
子类方法抛出的异常只能比父类方法抛出的异常少或相等,子类方法抛出的也只能是父类方法抛出的异常或者其子类,而不能是其的父类。
错误(Error)是指JVM的底层出现了错误,是程序所不能控制的,例如StackOverFlowError,OutOfMemoryError。
抛出异常时要带上原异常的信息,可以如下定义自己的异常:
public class DaoException extends RuntimeException //继承RuntimeException的都是运行时异常
{ ...
public DaoException(String message, Throwable cause) {
super(message, cause);
} }
抛出异常时的代码,这里抛出的是运行时异常,引用该方法的地方不要求强制处理:
public static void updateObject(String sql, String[] params) throws DaoRuntimeException {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = DBConnectionManager.getConnection();
pstmt = conn.prepareStatement(sql);
for (int i = 0; params != null && i < params.length; i++) {
pstmt.setString(i + 1, params[i]);
}
rs = pstmt.executeUpdate();
} catch (Exception e) {
logger.info("Execute sql : " + sql + " fail!!!");
throw new DaoRuntimeException(e.getMessage(),e);
} finally {
DBConnectionManager.free(conn, pstmt, rs);
}
}
文件加载常见的代码如下:
InputStream is = new FileInputStream("src/test.properties");
这样的写法是文件一旦换了路径还要修改,还有打包成运行程序时,是没有src目录的,这时也可以用下面的方法来加载文件:
InputStream is = FileLoadTest.class.getClassLoader.getResourceAsStream(test.properties);
这时只要test.properties在classpath下面即可,和具体的路径无关。
new一个对象时,初始化的顺序是:静态变量和静态代码块,成员变量,构造方法。
public class Tests {
private static Tests t = new Tests();
private static String s = "d";
public Tests(){
s = "abc";
}
public static void main(String [ ] args) {
System.out.println(s);
}
}
上面的代码输出的结果是d,注意初始化的顺序就可以得到正确的结果了。
同步方法锁住的是类本身的class,由于class只会有一个,也就是说一个同步方法锁住了class的话,该类中的其他同步方法就只能等待了。相比较如果使用同步代码块,不同方法可以锁不同的对象,冲突的机会要小一些。
Java基础之Throwable,文件加载的更多相关文章
- Java中的资源文件加载方式
文件加载方式有两种: 使用文件系统自带的路径机制,一个应用程序只能有一个当前目录,但可以有Path变量来访问多个目录 使用ClassPath路径机制,类路径跟Path全局变量一样也是有多个值 在Jav ...
- php基础语法(文件加载和错误)
文件加载 有4个文件加载的语法形式(注意,不是函数): include, include_once, require, require_once; 他们的本质是一样的,都是用于加载/引入/包含/载 ...
- 【Java基础】通过getResourceAsStream() 加载资源文件
Class.getResourceAsStream(String path) path不以"/"开头时,默认是从当前类所在的包下面获取资源 path以"/"开头 ...
- Java基础_类的加载机制和反射
类的使用分为三个步骤: 类的加载->类的连接->类的初始化 一.类的加载 当程序运行的时候,系统会首先把我们要使用的Java类加载到内存中.这里加载的是编译后的.class文件 每个类加载 ...
- java web.xml被文件加载过程及加载顺序小结
web.xml加载过程(步骤): 1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> ...
- java基础—多态(动态加载)
一.面向对象最核心的机制——动态绑定,也叫多态
- java类到底是如何加载并初始化的?
Java虚拟机如何把编译好的.class文件加载到虚拟机里面?加载之后如何初始化类?静态类变量和实例类变量的初始化过程是否相同,分别是如何初始化的呢?这篇文章就 是解决上面3个问题的. 若有不正之处, ...
- (转)java类到底是如何加载并初始化的?
Java虚拟机如何把编译好的.class文件加载到虚拟机里面?加载之后如何初始化类?静态类变量和实例类变量的初始化过程是否相同,分别是如何初始化的呢?这篇文章就 是解决上面3个问题的. 若有不正之处, ...
- php基础知识(3)(文件加载include)
文件加载 综述: 有4个文件加载的语法形式(注意,不是函数): include, include_once, require, require_once; 他们的本质是一样的,都是用于加载/引入/ ...
随机推荐
- c++只能编译无法运行或许缺少命令
-mwindows -lcomctl32 -lwinmm -lws2_32 -lodbc32 -lmysql -lwinspool1.工具-编译选项-编译器-在连接器命令行加入以下命令:-mwin ...
- RPM挂载光盘(使用iso里面的来搭建yum环境)就是离线模式,
找到光盘的完整路径名.在命令行输入:ls -l /dev | grep cdrom. 可以看到光盘的名字叫做:cdrom1.然后在命令行执行: mount /dev/cdrom1 /mnt/ ...
- Vue中的$set的使用
在我们使用vue进行开发的过程中,可能会遇到一种情况:当生成vue实例后,当再次给数据赋值时,有时候并不会自动更新到视图上去: 当我们去看vue文档的时候,会发现有这么一句话:如果在实例创建之后添加新 ...
- zzuli oj 1135 算菜价
题目: Description 妈妈每天都要出去买菜,但是回来后,兜里的钱也懒得数一数,到底花了多少钱真是一笔糊涂帐.现在好了,作为好儿子(女儿)的你可以给她用程序算一下了,呵呵. Input 输入含 ...
- 空数组在以下三种遍历中均不可更改:forEach、map和for...in
首先,我们要知道对于forEach.map和for...in三种遍历,在不是空数组的情况下,要想实现更改原数组的方法,代码如下: var list = [1,2,3,4]; var list1 = [ ...
- HTTP协议简介
一.简介 HTTP(HyperText Transfer Protocol, 超文本传输协议) 是访问互联网使用的核心通信协议,也是所有web应用程序使用的通信协议.消息模型:客户端发送请求消息,服务 ...
- 版本控制——TortoiseSVN (1)安装与配置
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- 通过自定义的URL Scheme启动你的App
iPhone SDK可以把你的App和一个自定义的URL Scheme绑定.该URL Scheme可用来从浏览器或别的App启动你的App. 如何响应从别的App里发给你的URL Scheme申请,由 ...
- Java数据持久层框架 MyBatis之API学习三(XML 映射配置文件)
对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...
- canvas实现倒计时效果示例(vue组件内编写)
前言: 此事例是在vue组件中,使用canvas实现倒计时动画的效果.其实,实现效果的逻辑跟vue没有关系,只要读懂canvas如何实现效果的这部分逻辑就可以了 canvas动画的原理:利用定时器,给 ...