优雅的异常处理 -- Java中的异常

一、异常Exception

概念:Java异常是Java提供的一种识别及响应错误的一种机制。

1.首先了解一下Exception和Error之间的关系
  1. 下图展示的只是Exception中的三个子类,其实有很多子类,每个子类下面又分有子类!
    在这里插入图片描述
  2. Exception基本分为2种类型:
    非检查异常(unckecked exception): 表示编译的时候不会报错,这点和Error及其子类是也一样的。包括RuntimeExceotion和其子类。
    检查异常(checked exception): 表示编译的时候会报错。除了RuntimeException和它的子类,其他Exception的子类都是检查型异常。
  3. Error:用于指示合理的应用程序不应该试图捕获的严重问题,大多数这样的错误都是异常条件。
    Error及其子类在编译的时候也不会报错。
    Exception和Error都是属于Throwable的子类
    相同点:Error及其子类和RuntimeException及其子类,编译都不会报错。
    区别:Exception可以使用try-catch和throws处理异常,而Error是不能处理的,需要重新修正代码。
2.常见的异常
  1. 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
  1. java.lang.ArithmeticException: 当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
    示例:
System.out.println(1/0);//运行报错:java.lang.ArithmeticException
  1. 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;
}
  1. java.lang.ClassCastException: 当试图将对象强制转换为不是实例的子类时,抛出该异常。
    示例:
Object x = new Integer(0);
System.out.println((String)x);//运行报错java.lang.ClassCastException
  1. java.text.ParseException: 表示解析时出现意外错误。
    示例:
SimpleDateFormat s = new SimpleDateFormat();
s.parse("11");//解析直接报错java.text.ParseException

二、异常处理

异常处理有2种方法:
  1. try-catch 其中的finally可以省略
    1. 处理好之后,后面的语句会继续执行
    2. catch(Exception e) 可以用Exception父类
    3. 注意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("继续执行");
  1. 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");//这里没有执行 
	}
}

三、异常信息的获得

异常信息的获得方式

  1. 直接打印异常对象
  2. 通过异常对象,调用getMessage()方法获得
  3. 通过异常对象,调用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 "注册成功";
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值