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,文件加载的更多相关文章

  1. Java中的资源文件加载方式

    文件加载方式有两种: 使用文件系统自带的路径机制,一个应用程序只能有一个当前目录,但可以有Path变量来访问多个目录 使用ClassPath路径机制,类路径跟Path全局变量一样也是有多个值 在Jav ...

  2. php基础语法(文件加载和错误)

    文件加载 有4个文件加载的语法形式(注意,不是函数): include,  include_once,  require, require_once; 他们的本质是一样的,都是用于加载/引入/包含/载 ...

  3. 【Java基础】通过getResourceAsStream() 加载资源文件

    Class.getResourceAsStream(String path) path不以"/"开头时,默认是从当前类所在的包下面获取资源 path以"/"开头 ...

  4. Java基础_类的加载机制和反射

    类的使用分为三个步骤: 类的加载->类的连接->类的初始化 一.类的加载 当程序运行的时候,系统会首先把我们要使用的Java类加载到内存中.这里加载的是编译后的.class文件 每个类加载 ...

  5. java web.xml被文件加载过程及加载顺序小结

    web.xml加载过程(步骤): 1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> ...

  6. java基础—多态(动态加载)

    一.面向对象最核心的机制——动态绑定,也叫多态

  7. java类到底是如何加载并初始化的?

    Java虚拟机如何把编译好的.class文件加载到虚拟机里面?加载之后如何初始化类?静态类变量和实例类变量的初始化过程是否相同,分别是如何初始化的呢?这篇文章就 是解决上面3个问题的. 若有不正之处, ...

  8. (转)java类到底是如何加载并初始化的?

    Java虚拟机如何把编译好的.class文件加载到虚拟机里面?加载之后如何初始化类?静态类变量和实例类变量的初始化过程是否相同,分别是如何初始化的呢?这篇文章就 是解决上面3个问题的. 若有不正之处, ...

  9. php基础知识(3)(文件加载include)

    文件加载 综述: 有4个文件加载的语法形式(注意,不是函数): include,  include_once,  require, require_once; 他们的本质是一样的,都是用于加载/引入/ ...

随机推荐

  1. Gym101522A Gym101522C Gym101522D

    Gym101522A A There are two popular formats for representing a date: day/month/year or month/day/year ...

  2. UVA10382-Watering Grass-贪心 NYOJ6-喷水装置(一)-贪心

    10382 - Watering Grass Time limit: 3.000 seconds n sprinklers are installed in a horizontal strip of ...

  3. hdu3076—概率dp

    hdu3076-概率dp 标签 : 概率dp 题目链接 题意: 2个人分别有AB的血数,轮流扔骰子,数小的自减一血,平的不变,谁先到减0, 谁输,问A赢的概率. 题解: dp[i][j]表示的是第一个 ...

  4. maven(01)--安装及其介绍

    1:下载maven windows下载 2:将下载文件夹解压,然后放在一个安装目录(可任意选择),例如就放在D盘的根目录 然后在设置环境变量,新建一个环境变量,名称为M2_HOME,其设置值为mave ...

  5. 使用Eclipse在Excel中找出两张表中相同证件号而姓名或工号却出现不同的的项

    1:首先把Excel中的文本复制到txt中,复制如下: A表: 证件号                           工号  姓名 310110xxxx220130004 101 傅家宜3101 ...

  6. Linux chmod命令及权限含义

    对于一条权限赋值命令:sudo chmod  -R 764 ×××:我们必须了解其含义: (1)各字段含义:sudo chmod  -R(更改文件夹及其子文件夹)                    ...

  7. console.log()的作用是什么

    主要是方便你调式javascript用的.你可以看到你在页面中输出的内容. 相比alert他的优点是: 他能看到结构话的东西,如果是alert,淡出一个对象就是[object object],但是co ...

  8. cuda纹理内存的使用

    CUDA纹理内存的访问速度比全局内存要快,因此处理图像数据时,使用纹理内存是一个提升性能的好方法. 贴一段自己写的简单的实现两幅图像加权和的代码,使用纹理内存实现. 输入:两幅图 lena, moon ...

  9. c指针作为参数传递以及指针的指针

    指针作为函数参数传递 函数参数传递的只能是数值,所以当指针作为函数参数传递时,传递的是指针的值,而不是地址. #include "stdio.h" void pointer(int ...

  10. Source Insight、Xshell(putty)、Xftp

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...