错误:程序运⾏时发⽣的不被期望的事件,阻⽌了程序按照预期正常执⾏
常⻅程序错误分三类:
编译错误:新⼿最常⻅,没遵循语法规范
运⾏时错误:程序在执⾏时
逻辑错误:程序没有按照预期的逻辑顺序执⾏
Java.lang软件包中有⼀个java.lang.Throwable类,这个类是java中所有错误和异常的超类,Throwable类有两个⼦类,Error与 Exception
是Throwable 的⼦类,包含⼤量⼦类
出错后程序⽆法处理,如OutOfMemoryError
是Throwable 的⼦类,包含⼤量⼦类
程序本身可以处理的异常,如ArrayIndexOutOfBoundException
可查异常(编译器要求必须处置的异常):RuntimeException及其⼦类以外,其他的Exception类及其⼦类, 如 IOException和ClassNotFoundException
不可查异常(编译器不要求强制处置的异常): 包括运⾏时异常(RuntimeException与其⼦类)和错误(Error),如ArrayIndexOutOfBoundsException
可查异常(必须要在⽅法⾥⾯捕获或者抛出)
ClassNoFoundException 应⽤程序试图加载类,找不到对应的类
IllegalAccessException 拒绝访问⼀个类的时候
NoSuchFieldExcetion 请求的变量不存在
NoSuchMethodException ⽅法不存在
不可查异常
ArrayIndexOutOfBoundsException 数组索引越界
ClassCastException 强制失败抛出异常
NullPointerException 需要对象的地⽅使⽤ null 时,抛出该异常
NumberFormatException 将字符串转换成⼀种数值类型,但该字符串不能转换为适当格式时,抛出该异常
public String getMessage()
异常的详细信息
public Throwable getCause()
异常原因
public void printStackTrace()
打印错误的堆栈信息,即错误输出流,可以看到错误原因和所在位置
public StackTraceElement [] getStackTrace()
堆栈层次的数组,下标为0的元素代表栈顶,最后⼀个元素代表⽅法调⽤堆栈的栈底
# 如下
public class ExceptionTest {
public static void main(String [] args){
try{
int result = 25/0;
System.out.println(result);
}catch (Exception e){
String msg = e.getMessage();
StackTraceElement [] arr = e.getStackTrace();
e.printStackTrace();
}
}
}
# 控制台
java.lang.ArithmeticException: / by zero
at chapter7_2.ExceptionTest.main(ExceptionTest.java:7)
try{
// 可能发⽣异常的代码
}catch(AExceptionName e){
//出异常的时候处理
}catch(BExceptionName e){
}fianall{
}
try后⾯跟⼀个或多个catch块,或⼀个finally块,或两者的组合
catch 不能独⽴于 try ⽽单独存在
如果代码没有对应的异常类进⾏捕获,则默认打印异常堆栈
# 如下
public class Exceotion2Test {
public static void main(String [] args){
test();
}
public static void test(){
try {
Student student = new Student();
student.setAge(-1);
}catch (NullPointerException e){
System.out.println("出异常了 NullPointerException");
}catch (IllegalArgumentException e){
System.out.println("出异常了 IllegalArgumentException");
}
}
}
⼀个 try 代码块后⾯跟多个 catch 代码块的情况就叫多重捕获
代码中发⽣异常,异常被抛给第⼀个 catch 块, 如果不匹配则继续往下⼀个catch进⾏传递
try{
// 可能发⽣异常的代码
}catch(ExceptionName1 e1){
//出异常的时候处理
}catch(ExceptionName2 e2){
//出异常的时候处理
}
⽤来创建在 try 代码块后⾯执⾏的代码块
finally 代码块中的代码总会被执⾏
⼀般⽤于资源回收释放等操作
try、catch和finally块有两种可能的组合:try-catch-finally或try-finally
try{
// 可能发⽣异常的代码
}catch(ExceptionName1 e1){
//出异常的时候处理
}finally{
//肯定执⾏的代码
}
try{
// 可能发⽣异常的代码
}finally{
//肯定执⾏的代码
}
# 如下
public class TestException3 {
public static void main(String [] args){
int result = divide(25,0);
System.out.println("最终结果="+result);
}
public static int divide(int num1, int num2){
try {
int result = num1/num2;
return result;
}catch (Exception e){
System.out.println("出异常");
}finally {
System.out.println("finally执行了");
return -2;
}
}
}
# 控制台
出异常
finally执行了
最终结果=-2
throws 声明异常 往外抛出
throws⼦句放在⽅法参数列表的右括号之后,⼀个⽅法可以声明抛出多个异常,多个异常之间⽤逗号隔开
# 如下方式抛出异常
public class Main {
public static void readChar() throws IOException,RemoteException {
int input = System.in.read();
}
}
try catch中捕获了异常,处理⽅法
捕获⾃⼰处理然后继续往外⾯抛异常
# 如下方式抛出异常
throw new ExceptionName("异常信息");
# 如下
public class TestException5 {
public static void main(String [] args)throws Exception{
int result = divide(25,0);
}
public static int divide(int num1, int num2)throws Exception{
try {
int result = num1/num2;
return result;
}catch (Exception e){
System.out.println("出异常了");
throw new Exception("参数异常");
}
}
}
# 控制台
出异常了
Exception in thread "main" java.lang.Exception: 参数异常
at chapter7_5.TestException5.divide(TestException5.java:15)
at chapter7_5.TestException5.main(TestException5.java:6)
public class UserNotEnoughException extends Exception {
private int code;
private String msg;
public UserNotEnoughException(){
super();
}
public UserNotEnoughException(int code, String msg){
super(msg);
this.code = code;
this.msg = msg;
}
public void setCode(int code) {
this.code = code;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
public class CustomExceptionTest {
public static void main(String [] args){
try{
test();
}catch (NullPointerException e){
e.printStackTrace();
}catch (UserNotEnoughException e){
int code = e.getCode();
String msg = e.getMsg();
e.printStackTrace();
System.out.println("code="+code + ", msg="+msg);
}
}
// 抛出异常
public static void test()throws UserNotEnoughException{
throw new UserNotEnoughException(-1,"人员不够异常");
}
}
# 控制台
chapter7_6.UserNotEnoughException: 人员不够异常
at chapter7_6.CustomExceptionTest.test(CustomExceptionTest.java:22)
at chapter7_6.CustomExceptionTest.main(CustomExceptionTest.java:10)
code=-1, msg=人员不够异常