java系统中将java.lang.Throwable类作为异常的最根类
[java.lang.Throwable是所有异常或错误的顶级类,可以处理任何异常]
* java.lang.Throwable * |-----java.lang.Error:一般不编写针对性的代码进行处理。 * |-----java.lang.Exception:可以进行异常的处理 * |------编译时异常(checked) * |-----IOException * |-----FileNotFoundException * |-----ClassNotFoundException * |------运行时异常(unchecked,RuntimeException) * |-----NullPointerException * |-----ArrayIndexOutOfBoundsException * |-----ClassCastException * |-----NumberFormatException * |-----InputMismatchException * |-----ArithmeticException
Throwable是所有异常或错误的顶级类,可以处理任何异常.
因为处理范围过大,操作不方便,Java提供两个子类:Exception和Error
Exception的分类: [根据 编译时 是否检查 含有 XX异常分类]
须查异常[非运行时异常]: 指 java文件编译为class文件时, 需要检查的异常.
不须查异常[运行时异常]: 指 java文件编译为class文件时, 不需要检查的异常.
Exception及其子类[不含RuntimeException]都属于须查异常[非运行时异常]
RuntimeException及子类属于不须查异常也就是运行时异常
语法错误 路径错误 等等
数组下标越界:java.lang.ArrayIndexOutOfBoundsException,Java程序试图访问不存在的索引对应的元素.
被除数为0: java.lang.ArithmeticException: / by zero,在计算机中,被除数不能为0.
空指针:java.lang.NullPointerException,Java程序试图去访问不存在的对象的属性或方法,因此报错.
使用try-catch-finally处理编译时异常,使得程序在编译时就不报错,但是运行是仍然可能报错
开发中由于运行时异常常见,通常不针对运行时异常try-catch-finally处理,而针对编译时异常,一定要考虑异常的处理
throws的方式知识将异常抛给了方法的调用者,并没有真正的将异常处理
try{ 存放可能发生异常的代码,try代码块将自动捕捉异常 }catch(异常类型 参数){ 与发生的异常进行匹配,匹配上后将执行此处代码 }catch(异常类型 参数){ 与发生的异常进行匹配,匹配上后将执行此处代码 }finally{ 作为程序最后执行的代码,一定会执行,即使try和catch里面有return或异常 }
说明:
原理:
try中的异常对象匹配到某一个catch时,就会进入到catch中进行异常的处理,一旦处理完成,就退出当前的try-catch结构(在没有写finally的时候),继续执行其后的代码
都是打印错误信息,方式不同
public void test1() { String str = "abc"; try { int num = Integer.parseInt(str); }catch(Exception e) { // 1. System.out.println(e.getMessage()); // 2. e.printStackTrace(); } }
快捷操作
格式: 权限.... 方法名(参数类型 参数名,参数类型 参数名,...) throws 异常类型,...{ 方法体 }
原理:
类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
import java.io.FileNotFoundException; import java.io.IOException; public class OverrideTest { public static void main(String[] args) { OverrideTest test = new OverrideTest(); test.display(new SubClass()); } public void display(SuperClass s){ try { s.method(); } catch (IOException e) { e.printStackTrace(); } } } class SuperClass{ public void method() throws IOException{ } } class SubClass extends SuperClass{ public void method()throws FileNotFoundException{ } }
如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finally方式处理。
执行的方法a中,先后又调用了另外的几个方法,这几个方法是递进关系执行的。我们建议这几个方法使用throws的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方式进行处理。
public class StudentTest { public static void main(String[] args) { try { Student s = new Student(); s.regist(-1001); System.out.println(s); } catch (Exception e) { // e.printStackTrace(); System.out.println(e.getMessage()); } } } class Student{ private int id; public void regist(int id) throws Exception { if(id > 0){ this.id = id; }else{ // System.out.println("您输入的数据非法!"); //手动抛出异常对象,运行时异常,可以不用try-catch // throw new RuntimeException("您输入的数据非法!"); // 必须进行try-catch throw new Exception("您输入的数据非法!"); //错误的 // throw new String("不能输入负数"); } } @Override public String toString() { return "Student [id=" + id + "]"; } }
如何自定义异常类?
public class MyException extends Exception{ static final long serialVersionUID = -7034897193246939L; public MyException(){ } public MyException(String msg){ super(msg); } }
此时使用自己定义的异常类
package com.atguigu.java2; public class StudentTest { public static void main(String[] args) { try { Student s = new Student(); s.regist(-1001); System.out.println(s); } catch (Exception e) { // e.printStackTrace(); System.out.println(e.getMessage()); } } } class Student{ private int id; public void regist(int id) throws Exception { if(id > 0){ this.id = id; }else{ throw new MyException("不能输入负数"); } } @Override public String toString() { return "Student [id=" + id + "]"; } }
进入A----用A方法----制造异常----进入方法B-----调用B
throw 和 throws区别:
throw 表示抛出一个异常类的对象,生成异常对象的过程。声明在方法体内。
throws 属于异常处理的一种方式,声明在方法的声明处。