一、异常Exception
概念:Java异常是Java提供的一种识别及响应错误的一种机制。
1.首先了解一下Exception和Error之间的关系
- 下图展示的只是Exception中的三个子类,其实有很多子类,每个子类下面又分有子类!
- Exception基本分为2种类型:
非检查异常(unckecked exception): 表示编译的时候不会报错,这点和Error及其子类是也一样的。包括RuntimeExceotion和其子类。
检查异常(checked exception): 表示编译的时候会报错。除了RuntimeException和它的子类,其他Exception的子类都是检查型异常。 - Error:用于指示合理的应用程序不应该试图捕获的严重问题,大多数这样的错误都是异常条件。
Error及其子类在编译的时候也不会报错。
Exception和Error都是属于Throwable的子类
相同点:Error及其子类和RuntimeException及其子类,编译都不会报错。
区别:Exception可以使用try-catch和throws处理异常,而Error是不能处理的,需要重新修正代码。
2.常见的异常
- java.lang.IndexOutOfBoundsException:指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
子类分为:ArrayIndexOutOfBoundsException和StringIndexOutOfBoundsException
ArrayIndexOutOfBoundsException: 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
StringIndexOutOfBoundsException: 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。对诸如 charAt 的一些方法,当索引等于字符串的大小时,也会抛出该异常。
示例:
String str="";
str.charAt(0);//运行报错StringIndexOutOfBoundsException
int[] arr1={1,2};
System.out.println(arr1[2]);//运行报错ArrayIndexOutOfBoundsException
- java.lang.ArithmeticException: 当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
示例:
System.out.println(1/0);//运行报错:java.lang.ArithmeticException
- java.lang.NullPointerException: 当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包括:
调用 null 对象的实例方法。
访问或修改 null 对象的字段。
将 null 作为一个数组,获得其长度。
将 null 作为一个数组,访问或修改其时间片。
将 null 作为 Throwable 值抛出。
示例:
class Test{
public static void main(String[] args){
int[] arr=null;
System.out.println(arr.length);//运行报错:java.lang.NullPointerException
Student stu=null;
stu.name="老王";//运行报错:java.lang.NullPointerException
stu.get();//运行报错:java.lang.NullPointerException
}
static void get(){}
}
class Student{
String name;
}
- java.lang.ClassCastException: 当试图将对象强制转换为不是实例的子类时,抛出该异常。
示例:
Object x = new Integer(0);
System.out.println((String)x);//运行报错java.lang.ClassCastException
- java.text.ParseException: 表示解析时出现意外错误。
示例:
SimpleDateFormat s = new SimpleDateFormat();
s.parse("11");//解析直接报错java.text.ParseException
二、异常处理
异常处理有2种方法:
- try-catch 其中的finally可以省略
- 处理好之后,后面的语句会继续执行
- catch(Exception e) 可以用Exception父类
- 注意finlly的用法
格式示例:
try{
//可能产生异常的代码
//然后去匹配catch里面的类型
//如果都没有就执行finally和后面的功能
}catch(捕获的异常类型 e){ //e是形式参数
//该异常捕获之后要做的操作
}catch(捕获的异常类型 e){ //e是形式参数
//该异常捕获之后要做的操作
}finally{
//如果有finally,除非提前关闭虚拟机,那么finally语句一定会执行
//即使try-catch中有return等语句,也会继续执行。
//常用来①流资源关闭②释放锁
//不建议有return语句,程序难理解
}
try{
int[] arr2 = null;
//int length = arr2.length;
System.out.println(1/0);
//System.exit(0); //关闭虚拟机
}catch(Exception e){//异常诞生的子类类型的异常对象,设置参数类型为父类,所有的异常都可以捕获了!
System.out.println(e+"异常处理完成");
}finlly{
System.out.println("继续执行");
}
System.out.println("继续执行");
- throws
1.方法头:throws关键字,抛出异常类型。后面的代码不会继续执行
2.异常抛出,可以在方法头抛出多个异常
3.可以直接抛出一个大的异常Exception: 数据类型的兼容
示例:
class Test{
public static void main(String[] args) throws ParseException {
SimpleDateFormat s1 = new SimpleDateFormat();
s1.parse("hb");//throws ParseException 采用抛出的方式,后面的代码不会执行的
System.out.println("继续执行11");//这里没有执行
}
}
三、异常信息的获得
异常信息的获得方式
- 直接打印异常对象
- 通过异常对象,调用getMessage()方法获得
- 通过异常对象,调用printStackTrace 打印异常信息
示例:
try {
System.out.println(1/0);
} catch (Exception e) {
System.out.println(e);//直接打印
System.out.println(e.getMessage()); //getMessage()方法
e.printStackTrace(); //printStackTrace()方法
}
四、throw
throw:创造异常,产生异常
throws:抛出异常,处理异常
五、自定义异常
java中的异常不可能都写完了,所以根据现实需要,需要自定义需要的异常。
这里举例说明throw和自定义异常一起的使用情况
示例:
package SelfDefinedException;
public class SelfDefinedExceptionDemo extends Exception{//异常名需要继承继承或者Throwable
public SelfDefinedExceptionDemo(){
super();//参考源码里面的异常书写
}
public SelfDefinedExceptionDemo(String name){
super(name);//参考源码里面的异常书写
}
}
package Throw;
import SelfDefinedException.SelfDefinedExceptionDemo;
public class ThrowDemo {
static String[] name={"username","admin","bitter","person","steam"};
public static void main(String[] args) throws SelfDefinedExceptionDemo {
if(compare("aaa").equals("注册成功")){//如果用户注册成功 就把用户名添加到新数组
String[] name1=new String[name.length+1];
name1[name.length]="aaa";
}
}
static String compare(String username) throws SelfDefinedExceptionDemo{
for (int i = 0; i < name.length; i++) {//遍历用户名数组
if(username.equals(name[i])){//如果用户名已经存在 就抛出新异常(用户名已注册)
throw new SelfDefinedExceptionDemo("用户名已注册");
}
}
System.out.println("注册成功");
return "注册成功";
}
}