Java代码在运行时期发生的问题就是异常
如果出现异常我们没有处理,jvm会帮我们进行处理,他会把异常的类型,原因还有位置显示在命令行并且还终止了程序,异常后面的代码将不在执行
捕获:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理捕获异常格式:
try { //需要被检测的语句。 } catch(异常类 变量) { //参数。 //异常的处理语句。 } finally { //一定会被执行的语句。 }try:该代码块中编写可能产生异常的代码。
catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。
throws使用:
权限修饰符 返回值类型 方法名(形参列表) throws 异常类型1,异常类型2….{
}
案例
import java.io.FileWriter; public class Throws_Test01 { /* * 异常的处理方式: * 捕获处理 * try...catch语句 * * try { * 有可能出现问题的代码; * } catch(ArithmeticException ae) { * 处理异常; * } * * try...catch的执行顺序: * 首先执行try语句 * 如果发现异常,异常下面的代码不在执行,直接跳入catch语句中,catch语句结束后,整个try...catch结束 * 如果没有发现异常,try语句执行结束后,try...catch直接结束, 不在执行catch语句 * * * 抛出去 * 当我们不想处理异常,或者没有能力处理的时候,我们可以选择抛出异常,谁调用方法谁处理异常 * 使用关键字throws在方法的声明出抛出异常 * * * jvm处理异常的方式: * 如果出现异常我们没有处理,jvm会帮我们进行处理,他会把异常的类型,原因还有位置显示在命令行 * 并且还终止了程序,异常后面的代码将不在执行 */ public static void main(String[] args) throws Exception { //method(); function(); } public static void function() throws Exception { FileWriter fw = new FileWriter("a.txt"); } private static void method() { try { System.out.println(1); //System.out.println(2 / 0); System.out.println(2); } catch(ArithmeticException ae) { System.out.println("除数不能为0"); } System.out.println(3); } }对代码进行异常检测,并对检测的异常传递给catch处理。对每种异常信息进行不同的捕获处理。
void show(){ //不用throws try{ throw new Exception();//产生异常,直接捕获处理 }catch(XxxException e){ //处理方式 }catch(YyyException e){ //处理方式 }catch(ZzzException e){ //处理方式 } }注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。
package com.day008; public class TryCatch_Test04 { /* * 如何处理多个异常: * 可以使用多个try...catch语句 * 使用一个try和多个catch * * 多个catch之间的顺序: * 多个catch之间可以有子父类 * 平级之间没有顺序关系 * 如果有子父类,父类异常必须放在后面 * * */ public static void main(String[] args) { try { //异常1 String s = null; System.out.println(s.length()); //异常2 int[] arr = new int[5]; System.out.println(arr[8]); //异常3 System.out.println(2 / 0); } catch(ArrayIndexOutOfBoundsException e) { System.out.println("出现数组越界了"); } catch(NullPointerException e) { System.out.println("出现空指针了"); } catch(Exception e) { System.out.println("出现异常了"); } } }
String getMessage() 返回此 throwable 的详细消息字符串
String toString() 返回此 throwable 的简短描述
void printStackTrace() 打印异常的堆栈的跟踪信息
案例:
package com.day008; public class TryCatch_Test05 { /* * Throwable的常用方法: String getMessage() String toString() void printStackTrace() * */ public static void main(String[] args) { try { System.out.println(2 / 0); } catch(ArithmeticException e) { //String getMessage() : 异常产生的原因 System.out.println(e.getMessage()); //String toString() : 异常类型和原因 //System.out.println(e.toString()); //void printStackTrace() : 异常类型和原因以及位置 //e.printStackTrace(); } System.out.println("hello"); } }throws:处理异常的一种方式,把异常抛出,由调用者来处理
throw:制造异常的方式,并且结束方法
注意:如果抛出(throw)的是编译时期异常,必须在方法声明处抛出(throws)
非常简单,写一个类去继承Exception或者RuntimeException,然后实现多个构造即可
注意:自定义异常,其实就是让我们起个名字(一定要见名知意);
如果我们定义的是编译时期异常: 继承 Exception.需要根据父类的构造产生本类的构造
如果我们定义的是运行时期异常: 继承 RunTimeException.需要根据父类的构造产生本类的构造
案例:
package com.day008; //如何自定义异常,最简单的就是继承父类,重写空参有参构造方法即可 public class MyException extends RuntimeException{ public MyException() { super(); } public MyException(String message) { super(message); } }