异常处理
try-catch 捕获异常原理:
在Java中,当有代码执行发生异常时,在Java底层会产生异常的实例对象,catch会将要捕获的异常类型和程序中已经发生的异常类型进行匹配,如果类型相同,则进入catch语句进行异常的处理,否则,异常发生,程序中断。
try{ //try表示对可能出现问题的代码进行包围(监视)
}
catch(Exception e){ //表示捕获并处理对应类型的异常
//处理异常可以通过其他业务逻辑实现处理
}
finally{ //finally 表示程序是否发生异常,最终必然执行的代码段
}
一旦程序发生异常后,将导致程序无法继续执行。所以通过try-catch对异常进行捕获处理。
Java的异常结构
Throwable 是Java中所有异常和错误的超类。
Throwable 中有两个分支:Error 和 Exception
Error:表示程序无法控制的错误,该类错误无法进行try-catch捕获,属于程序运行中的致命问题。
Exception:表示通过try-catch捕获解决的问题,称为异常。
Exception 异常又分为RuntimeException 和 非 RuntimeException
RuntimeException 表示当程序在运行过程中产生的异常,该类异常有着不稳定性。
非 RuntimeException 表示程序中的显著异常,必须要解掉异常,程序才能编译和运行。
异常处理流程:
先对程序进行测试,测试无误后再将可能出现的代码进行try-catch捕获,以防万一。
多重try-catch
注意点:先捕获的catch语句将会导致后面的catch语句无法执行。
throw
throw 产生异常后,将导致程序流无法继续执行。
throw 用于引发异常,使程序的非法情况让程序员更加重视,并且也可以在异常产生后对其进行try-catch的处理。
throw 主要用于系统底层的架构,实现项目中的一整套错误信息的提示。
自定义引发的异常不能直接进行try-catch处理,这样会导致throw的无意义,如果引发的异常是非RuntimeException,则必须使用throws 将异常对外抛出。(throws写在方法后面)
/**
*自定义的LowNumberException异常
**/
public class LowNumberException extends ActivationException{
/**
* 构造方法,传入错误信息
* @param message
*/
public LowNumberException(String message){
super(message);
}
}
/**
* 该方法要求参数不能小于10
* @param num
*/
public void method(int num) throws LowNumberException{
if(num < 10){
throw new LowNumberException(num+"异常,应大于等于10!");
}
System.out.println("执行了method方法,使用参数进行了运算");
}
调用抛出了非Runtime异常的方法必须要进行处理。
如果底层方法中的异常在内部调用时始终对外抛出(throws),那么在main方法中则必须要进行try-catch处理。
在子类和父类中,子类重写父类的方法时,不能抛出父类异常类型以外的的异常。
一个类允许抛出多个异常
/**
* 一个类允许抛出多个异常
*
*/
public void selfMethod() throws LowNumberException, IOException,ClassNotFoundException {
- }
程序架构一般都使用三层架构的方式来实现:
数据层 用于数据库的连接,底层数据的处理。
业务层 用于项目需求中业务逻辑的实现。
表现层 用于界面的表现
throw 一般在数据层或者业务层所要调用的工具类、组件类抛出异常,通常由数据层或者业务层对这些工具类进行调用,当方法异常时可以更好的清楚异常的原因,并进行try- catch的处理。
日志文件
properties 称为属性文件,属于配置文件的一种。还有一种是 xml 文件。
properties文件的数据存储方式是按照键值对的方式进行存储。即 key = value
日志记录分为多个级别:debug 、info 、 warn 、error
创建日志对象(两种方式)
//方法一:传入当前类的class模板
private Logger log = Logger.getLogger(Demo5.class);
//方法二:传入类的完整类路径
private Logger log = Logger.getLogger("com.niit.Demo5");
断言
断言是对一个程序逻辑的某种假设进行测试的方法。
默认情况JVM是禁止断言,通过修改JVM参数 : -enableassertions
断言的表达式
assert 表达式:执行的代码
表达式的结果必须是boolean类型,如果为false时执行后面的测试代码。
public class Demo6 {
/**
* 方法要求参数的姓名必须以T开头
* @param name
*/
public void method(String name){
char ch = name.charAt(0);
//常规的测试方式,使用条件判断
// if(ch == 'T' || ch == 't'){
// System.out.println("姓名是:"+name);
// }
// else{
// System.out.println("非法的姓名");
// }
//使用断言测试姓名是否是首字母为t
assert ch == 'T' || ch == 't':"非法的姓名";
System.out.println("姓名是:"+name);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo6 demo = new Demo6();
demo.method("aom");
}
}