您的位置:首页 > 编程语言 > Java开发

异常、断言、和日志处理笔记

2018-03-15 14:59 253 查看
异常处理
异常抛出 throw new IllegalAccessException{“something need to do“}
异常继承Error(不期望应用程序进行处理、比如内存耗尽等)、Exception(已检查异常和未检查异常(属于RuntimeException的子类))
异常处理的黄金法则“早抛出,后捕获”
覆盖一个方法时,他不能抛出比父类方法声明中还要多的已检查异常
异常捕获
try{dosomething();}
catch(Exceptionclass1 e){handler}
catch(Exceptionclass2 e){handler}
catch(Exceptionclass3 e){handler}
要求catch语句从上到下匹配,所以具体的异常类型必须放在前面
try{dosomething();}
catch(Exceptionclass1 | Exceptionclass2 | Exceptionclass3 e){handler}
要求handler只能在异常变量上调用所有异常类的共有方法。
try-with-resources语句
try(Scanner in = new Scanner(Path.get("usr/share/dict/words"));
PrintWriter out = new PrintWriter("output.txt")){
while(in.hasNext()){
out.printlnn(in.next().toLowerCase);
}
}
要求try()内的资源必须实现AutoCloseable接口,这个接口有一个单独的close方法,保证了close方法一定会被调用。同时资源按照初始化的相反顺序关闭,即out,先于in被关闭
finally字句
值得注意的是finally子句中不应该包含返回值,因为其会替换掉try中的返回值,其次finally子句中要确保不会发生异常,否则try中出现的异常会被finally异常掩盖
异常重抛
需要改变异常类别,即使用一个用户可以理解的异常来报告子系统的失败
例子:
try{
doWork();
}catch(SQLException ex){
throw new ServletException("database error",ex);//修改为用户便于理解的异常

Throwable ex2 = new CruftyOldException("dataBase error");
ex2.initCause(ex);//当异常类的构造函数没有参数保存异常原因时,可以用此方法
throw ex2;
}
捕获时可以用Throwable couse = ex.getCasue();获取原始异常

断言
断言是防御性编程的常见方法,断言机制允许你在测试时加入检测条件,并且在生产代码中会自动移除。
assert condition;
assert condition:expression;
例子:assert x>=0;当x小于0时,会抛出AssertionError异常
启用和禁用断言(加上 -enableassertions 或是 -ea)
java -ea MainClass

记录日志
采用Logger,日志管理系统会调用Logger.getGlobal()获得默认的日志记录器
Logger.getGlobal().info("Opening file"+filename);//会自动添加时间、调用类的类名和方法
Logger.global.setLevel(Level.OFF);info方法不会记录日志,但是消息会被创建。
日志级别SERVER,WARNING,INFO,CONFIG,FINE,FINER,FINEST默认情况前三个级别的日志会被记录下来,并且可以通过setLevel改变记录日志的级别
当日志级别设置的比INFO级别更加细粒度,需要改变日志处理器的配置,默认的日志处理器不会输出低于INFO级别的日志
logger.entering(String classname,String methodName,Object[] params)//放在方法第一条,用于记录方法的输入参数
logger.exiting(String className,String methodName,Object result)//放在方法return前面,用于记录方法的返回参数
void logp(Level L,String className,String methodName,String message)//可以更加精确地获取调用类和调用方法的准确位置
通过编辑配置文件,可以改变日志系统的不同属性,默认的配置文件位于jre/lib/logging.properties
如果需要使用其他配置文件,则需要在启动你的应用时,设置java.util.logging.config.file属性为你指定的配置文件的位置
java -Djava.util.logging.config.file=configFile.MainClass
为了记录下FINE级别的日志,需要在配置文件中修改默认日志记录器级别和处理器级别。或者绕过配置文件安装自己的处理器。
Logger logger = Logger.getLogger("com.mycompany.myapp");
logger.setLevel(LEVEL.FINE);
logger.setUserParentHandlers(false);
Handler handler = new ConsoleHandler();
handler.setLevel(LEVEL.FINE);
logger.addHandler(handler);
如果需要将日志发送到其他地方,日志API为此提供FileHandler和SocketHandler
FileHandler handler = new FileHandler();
logger.addHandler(handler);
记录会被发送到用户主目录下的javan.log文件中,这里n是一个整数,保证了日志文件的唯一性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 异常 日志 断言