java基础-异常
1.注意:开发中语法错误和逻辑错误不叫异常
2.java程序在执行过程中发生的异常事件分为:
(1)Error:java虚拟机无法解决的严重问题,如:JVM系统错误、资源耗尽等严重情况
比如:StackOverflowError和OOM,一般不编写针对性的代码进行处理
(2)Exception:其他因编程错误或偶然外在因素导致的一般性问题,可用针对性的代码进行处理
3.对于这些错误,有两种解决方法:一是遇到错误就终止,另一种是程序员编写程序时就考虑到错误的检测、错误信息的提示、处理;
异常又分为:编译时异常和运行时异常
4.异常体系结构:
java.lang.Throwable
java.lang.Error
java.lang.Exception
编译时异常:
IOException
ClassNotFoundException
运行时异常:
NullPointerException
ArrayIndexOutOfBoundsException
ClassCastException
NumberFormatException
InputMismatchException
ArithmeticException
(1)NullPointerException
public class Main {public static void main(String[] args) {new Test().test();} } class Test{public void test(){int[] arr = null;System.out.println(arr[3]);} }
(2)ClassCastException
import java.util.Date;public class Main {public static void main(String[] args) {new Test().test();} } class Test{public void test(){Object obj = new Date();String str = (String) obj;} }
(3) NumberFormatException
import java.util.Date;public class Main {public static void main(String[] args) {new Test().test();} } class Test{public void test(){String str = "abc";int i = Integer.parseInt(str);} }
5.异常处理机制的意义:
在编写程序时,往往需要检测分母为0、数据为空、输入的数据类型等等是否符合要求,会使用if-else语句进行检测,但太多的该语句会导致代码臃肿,可以采用异常处理机制;通过将异常处理的代码集中在一起,使程序简洁、优雅、易于维护
6.异常对象的产生:
(1)自动抛出:
由JVM自动生成
(2)手动抛出:由开发人员手动创建
7.try-catch-finally的使用
import java.util.Date;public class Main {public static void main(String[] args) {new Test().test();} } class Test{public void test(){String str = "abc";try {int i = Integer.parseInt(str);System.out.println(123);}catch (NumberFormatException e){System.out.println("出现数字转换异常了");}System.out.println(456);} }
当try中的语句发生异常时,就会跳出该代码块;
不一定非得写finally;
import java.util.Date;public class Main {public static void main(String[] args) {new Test().test();} } class Test{public void test(){String str = "abc";try {int i = Integer.parseInt(str);System.out.println(123);}catch (NumberFormatException e){System.out.println(e.getMessage());e.printStackTrace();}System.out.println(456);} }
实际开发中,对于异常的处理往往使用以上两种方式
println(s.getMessage())
s.printStackTrace
catch可以写多个;多个catch语句中的异常类型若有子父类关系,则必须保证子类在上,父类在下;
8.try-catch-finally的意义:
一般我们用它来处理编译时异常,使之异常在运行时出现;而对于运行时异常,我们一般不做干预;
import java.util.Date;public class Main {public static void main(String[] args) {System.out.println(new Test().test());} } class Test{public int test(){try {int[] arr = new int[10];System.out.println(arr[10]);return 1;}catch (ArrayIndexOutOfBoundsException e){return 2;}finally {return 3;}} }
结果为3
9.finally的使用:
finally是一定会被执行的语句,即使try和catch中有return语句,即使catch中又出现异常,也会执行该代码块;
实际应用中:像数据库连接、输入输出流、网络编程Socket等资源,JVM不能自动回收,我们需要手动进行资源释放,一般声明在finally中,因为声明在其他地方有不被执行的风险;
10.第二种异常处理方式:throws
throws写在方法的声明处,当方法体中出现了与之对应的异常对象,就会停止运行下面代码,将异常抛出给调用者;·
11.子类重谢方法规则:子类抛出的异常类型不大于父类被重写方法抛出的异常类型;
12.
两种异常处理方式的选择:
(1)当父类中被重写方法未抛出异常,则重写时要用try-catch
(2)当调用一个方法时,该方法又会调用其他几个方法,这时经常用throws的方式
13.手动抛出异常:
import java.io.IOException; import java.util.Date;public class Main {public static void main(String[] args) {Student s1 = new Student();s1.register(-100);} }class Student{private int id;public void register(int id){if(id > 0){this.id = id;}else {throw new RuntimeException("您输入的数据非法");}} }
14.自定义异常类:
(1)继承于现有异常结构:RuntimeException、Exception
(2)提供全局变量static final
(3)提供重载的构造器
import java.io.IOException; import java.util.Date;public class Main {public static void main(String[] args) {Student s1 = new Student();s1.register(-100);} }class Student{private int id;public void register(int id){if(id > 0){this.id = id;}else {throw new MyException("数据非法");}} } class MyException extends RuntimeException{static final long serialVersionUID = -21309428342L;public MyException(){}public MyException(String ms){super(ms);}}