文章目录
- 介绍
- 语法
- 抛出异常
- 方法定义使用throws
- 多catch
- finally
- 自定义异常
- 断言
- logging
- 其他日志库
- commons logging
- Log4j
介绍
一些错误是用户造成的(类型输入错误),一些错误的随机出现(网络终端、内存耗尽。。。),并且永远不可能避免
获取失败信息:
1、约定错误码
2、异常处理机制
Java内置了一套异常处理机制,使用异常来表示错误
异常是一种class,可以在任何地方抛出,但只需要在上层捕获,这样就和方法调用分离了
Error表示严重错误,程序对此一般无能为力
Exception是运行时错误,可以被捕获并处理;
Exception分为两大类:
1、RuntimeException以及它的子类
2、非RuntimeException
Java规定:
1、必须捕获的异常,包括Exception及其子类,但不包括RuntimeException及其子类,这种类型的异常称为Checked Exception
2、不需要捕获的异常,包括Error以及子类,RuntimeException及其子类
语法
抛出异常
捕获异常使用try—catch—语句
public class Main {public static void main(String[] args) {byte[] bs = toGBK("中文");System.out.println(Arrays.toString(bs));}static byte[] toGBK(String s) {try {// 用指定编码转换String为byte[]:return s.getBytes("GBK");} catch (UnsupportedEncodingException e) {// 如果系统不支持GBK编码,会捕获到UnsupportedEncodingException:System.out.println(e); // 打印异常信息return s.getBytes(); // 尝试使用用默认编码}}
}
方法定义使用throws
方法定义的时候,使用throws表示该方法抛出的异常类型,调用方在调用的时候必须强制捕获这些异常,否则编译器会报错
public class Main {public static void main(String[] args) {try {byte[] bs = toGBK("中文");System.out.println(Arrays.toString(bs));} catch (UnsupportedEncodingException e) {System.out.println(e);}}static byte[] toGBK(String s) throws UnsupportedEncodingException {// 用指定编码转换String为byte[]:return s.getBytes("GBK");}
}
多catch
每个catch分别捕获对应的Exception及其子类。
存在多个catch的时候,catch的顺序非常重要:子类必须写在前面。
public static void main(String[] args) {try {process1();process2();process3();} catch (UnsupportedEncodingException e) {System.out.println("Bad encoding");} catch (IOException e) {System.out.println("IO error");}
}
finally
无论是否有异常发生,都希望执行一些语句,finally语句块保证有无错误都会执行。
public static void main(String[] args) {try {process1();process2();process3();} catch (UnsupportedEncodingException e) {System.out.println("Bad encoding");} catch (IOException e) {System.out.println("IO error");} finally {System.out.println("END");}
}
自定义异常
常见的做法是自定义一个BaseException作为“根异常”,然后,派生出各种业务类型的异常。
BaseException需要从一个适合的Exception派生,通常建议从RuntimeException派生:
public class BaseException extends RuntimeException {
}
其他业务类型的异常就可以从BaseException派生:
public class UserNotFoundException extends BaseException {
}public class LoginFailedException extends BaseException {
}...
断言
断言(Assertion)是一种调试程序的方式。在Java中,使用assert关键字来实现断言。
public static void main(String[] args) {double x = Math.abs(-123.45);assert x >= 0;System.out.println(x);
}
语句assert x >= 0;即为断言,断言条件x >= 0预期为true。如果计算结果为false,则断言失败,抛出AssertionError。
使用assert语句时,还可以添加一个可选的断言消息:
assert x >= 0 : "x must >= 0";
Java断言的特点是:断言失败时会抛出AssertionError,导致程序结束退出。因此,断言不能用于可恢复的程序错误,只应该用于开发和测试阶段。
JVM默认关闭断言指令,即遇到assert语句就自动忽略了,不执行。
要执行assert语句,必须给Java虚拟机传递-enableassertions(可简写为-ea)参数启用断言。
logging
代码改好删除System.out.println()非常麻烦
日志就是Logging,它的目的是为了取代System.out.println()。
输出日志,而不是用System.out.println(),有以下几个好处:
- 可以设置输出样式,避免自己每次都写"ERROR: " + var;
- 可以设置输出级别,禁止某些级别输出。例如,只输出错误日志;
- 可以被重定向到文件,这样可以在程序运行结束后查看日志;
- 可以按包名控制日志级别,只输出某些包打的日志;
- 可以……
Java标准库内置了日志包java.util.logging,可以直接用
日志的输出可以设定级别。JDK的Logging定义了7个日志级别,从严重到普通:
SEVERE
WARNING
INFO
CONFIG
FINE
FINER
FINEST
默认级别是INFO,因此,INFO级别以下的日志,不会被打印出来。使用日志级别的好处在于,调整级别,就可以屏蔽掉很多调试相关的日志输出。
其他日志库
commons logging
第三方日志库,由apache创建的日志模块
下载地址:https://commons.apache.org/proper/commons-logging/download_logging.cgi
下载后,解压,jar文件与Java文件放到同一个目录
使用:
第一步,通过LogFactory获取Log类的实例; 第二步,使用Log实例的方法打日志。
Log4j
是一个非常流行的日志框架
通过配置文件配置
下载地址:https://logging.apache.org/log4j/2.x/download.html