一、异常
1.异常介绍
异常:程序无法正常执行。
异常(Throwable):包含Error和Exception两个子类
Error:这类不需要程序员关注,一般是由虚拟机生成并脱出。
2.异常(Exception)的种类
1.运行时异常(RuntimeException):在运行期间发生的异常,编译通过。
常见的运行时异常:
1.空指针异常(NullPointerException):当对象无法正常存在,会发生空指正。
处理方法:使用if判断
2.类型转换异常(ClassCastException):在多态中不同子类之间的转换,会发生类型转换异常。
处理方法:使用intansceof判断是否符合类型转换
public class TextEp { public static void main(String[] args) { //类型转换异常:ClassCastException A a1=new B();//B子类对象不能转为C子类 //C c=(C)a1;//运行时发生异常 //处理异常的方法:instanceof if(a1 instanceof C) { C c=(C)a1; } } } class A{ public void print() { System.out.println("父类方法"); } } class B extends A{ public void input() { System.out.println("A子类方法"); } } class C extends A{ public void test() { System.out.println("B子类方法"); } }
3.数学异常(ArithmeticException):例如除数为0时,则会出现数学异常。
处理方法:使用if进行判断(增强程序的健壮性)
public class TextEp { public static void main(String[] args) { //运行时的异常 //数学异常 int a=0; //System.out.println(5/a);//运行时发生异常 //处理数学异常:if if(a>0) { System.out.println(5/a); } } }
4.数字转换异常(NumberFormatException)
public class TextEp { public static void main(String[] args) { //数字转换异常:空指针(NullPointerException) String str="abc"; str=null; //System.out.println(str.length()); //解决异常的方法 if(str!=null) { System.out.println(str.length()); } } }
5.数组下标越界
6.数组长度负数异常
2.编译时异常( CheckedException):发生在编译期间,如果不处理程序无法运行。
3.异常处理
1.throw:异常抛出,抛给上一层处理,当前不处理。
2.try....catch....finally:异常捕获。
try中一旦遇到异常,try后面的代码不会继续执行,直接去找对应的catch,如果存在多个catch,从上到下依次判断。
无论try中是否出现异常,都会执行finally中的代码。
一个try后面可以跟多个catch,但至少有一个。
try中有多个catch时,捕获异常类型的范围要从小到大。
4.自定义异常
1.直接或间接的继承Throwable
2.运行时异常:继承自RuntimeException
package com.rexception; //自定义异常:运行时出现异常 public class TestC { public static void main(String[] args) throws B { //运行时异常 User user=new User(); user.setNum("123"); } } //自定义异常:运行时 RuntimeException class B extends RuntimeException{ public B() { } public B(String str) { super(str); } } //javabean:存储数据 class User{ private String name; private String num; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNum() { return num; } public void setNum(String num) throws B { if(num.length()==11) { this.num = num; }else { //抛出异常 System.out.println("电话格式不正确"); throw new B("电话长度必须11"); } } @Override public String toString() { return "User [name=" + name + ", num=" + num + "]"; } }
3.编译时异常: Exception或者某一个编译时异常的子类
public class TestR { public static void main(String[] args) { //自定义异常:编译时 User user=new User(); String num="1234"; try { user.setNum(num); } catch (A e) { e.printStackTrace(); } System.out.println(user); } } //自定义异常:对电话长度不等于11时报出异常 class A extends Exception{ //创建空构造器 public A() { } //自定义构造器 public A(String str) { super(str);//调用父类Exception传输值 } } //javabean:存储数据 class User{ private String name; private String num; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNum() { return num; } public void setNum(String num) throws A { if(num.length()==11) { this.num = num; }else { //抛出异常 System.out.println("电话格式不正确"); throw new A("电话长度必须11"); } } @Override public String toString() { return "User [name=" + name + ", num=" + num + "]"; } }