异常
RuntimeException是程序员逻辑思维不紧密导致的
throw&throws
throw关键字可以主动对外抛出一个异常。
通常下列情况我们会主动抛出异常:
1:当前代码片段出现了异常,但是该异常不应当在当前代码片段被解决时,可以将其抛出
2:程序可以运行,但是不满足业务要求时可以对外抛异常告知。(满足语法不满足业务)java中除了RuntimeException之外的其他异常throw抛出是编译器要求,必须在方法上使用throws声明该异常的抛出
当我们调用一个含有throws声明异常抛出的方法时,编译器要求我们必须处理该异常否则编译不通过。
处理手段有两种:
1:使用try-catch捕获其声明的异常
2:在当前方法上继续使用throws声明该异常的抛出
JAVA异常处理机制中的try-catch:
try{
可能出现异常的代码片段
}catch(XXXException e){
当try中出现XXXException后的解决办法
}
try语句块不能独立存在,后面必须跟catch或finally。finally是异常处理机制中的最后一块,它可以直接跟在try语句块之后或最后一个catch之后。
finally语句块的特点是:
只要程序可以执行到try语句块中,无论是否出现异常,最终都要执行finally块的代码。return也不能阻止finally代码块的执行
public class TryCatchDemo { public static void main(String[] args) { System.out.println("程序开始了"); try { // String str = null; // String str = ""; String str = "a"; //这里会出现空指针异常,虚拟机会实例化空指针异常实例并在这里抛出 System.out.println(str.length()); System.out.println(str.charAt(0)); System.out.println(Integer.parseInt(str)); //try语句块中某句话报错后,那么try语句块中这句话之后的代码均不会执行! System.out.println("!!!!!!!!!!!!!!!!"); //可以合并捕获异常,当不同异常处理手段相同时,可以用这种方式。 }catch(NullPointerException|StringIndexOutOfBoundsException e){ System.out.println("出现了空指针或下标越界的处理!"); }catch(Exception e){ //该方法用来在控制台输出异常的堆栈信息,便于程序员debug e.printStackTrace(); //message:消息 String message = e.getMessage();//获取错误信息 //message一般用于给用户进行提示,或者记录log日志时使用。 } System.out.println("程序结束了"); } }
/** * JDK7之后,java推出了自动关闭特性。 * 使得我们在源代码中异常处理机制在IO应用中得到了简化。 */ public class AutoCloseableDemo { public static void main(String[] args) { try( /* 只有实现了AutoCloseable接口的类才可以在这里定义并初始化。 并且编译器在编译时会将在这里定义的变量在finally中调用close将其关闭。 最终编译器会将当前代码改为Finally中关流的样子。 */ FileOutputStream fos = new FileOutputStream("fos.dat"); ){ String line = "hello"; fos.write(1); }catch(IOException e){ System.out.println("出错了"); } } }
自定义异常
通常使用自定义异常用来表达业务错误。
自定义异常应当做到以下几点:
1:类名要见名知意。
2:需要继承Exception(直接或间接继承均可)
3:提供超类中所有的构造器public class IllegalAgeException extends Exception{ public IllegalAgeException() { } public IllegalAgeException(String message) { super(message); } public IllegalAgeException(String message, Throwable cause) { super(message, cause); } public IllegalAgeException(Throwable cause) { super(cause); } public IllegalAgeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } }