异常_java_大全(学习笔记ing)

一.简介

1.异常解析

在程序执行的过程中发生了意外的情况,称为异常。

如:除数0,访问的下标不存在

一旦程序发生异常,将会终止程序,异常后面的代码就不执行了。

2.常见异常

ArithmeticException算术异常除数为0 
ClassCastException类型转换异常类型强制转换时
NumberFormatException数字格式异常转为数字
ParseException解析异常日期格式
NullPointerException空指针异常空对象调方法
		java.lang.ArithmeticException 算数异常 除数为0
		int a=3;
		System.out.println(a/0);
		
		java.lang.ArrayIndexOutOfBoundsException 数组越界异常
		int[] b={1,2,3,4};
		System.out.println(b[10]);
		
		java.lang.NullPointerException空指针指向异常 对象为空 不能调用其方法
		String c=null;
		System.out.println(c.charAt(0));
		
		java.lang.ClassCastException类型转化异常 强转时 {狗也是object类总不能转化成User类吧}
		Object object = new Object();
		String d=(String) object;
		
		java.text.ParseException解析异常 日期格式
		SimpleDateFormat sdf= new SimpleDateFormat("yyyy/MM/dd");
		Date e = sdf.parse("2022-02-22");//字符串转化为date类型
		System.out.println(e);

3.异常的分类

Throwable
           Exception
                         检查异常
                         RuntimeExecption
           Error

(1)Throwable 所有异常的父类

(2)Exception :异常 程序编辑过程中产生的异常,可以处理;

        (a)检查异常:编译时提示需要处理的异常(直接抛出去,捕获异常)

        (b)运行时异常(RunTimeException):运行时产生的异常,可以不去显示的处理 ,JVM在会处理 --- 就是把异常信息输出

(3)Error :错误,JVM和系统发生了错误,不能通过编码解决的,程序无法处理

4.产生

每一种异常在java中都对应一个java类来表示;

在程序发生异常时,会自动产生一个对应异常类对象,然后该异常对象交给jre,此过程就是抛出异常。

在jre接收到异常对象时,会寻找能处理异常的代码并不当前异常对象交个它处理,此过程为捕获异常。

Jre找不到处理的代码,程序终止。

5.处理异常

异常处理的方式:

(1)try.....catch 捕获

(2)throws 抛出异常

try{
    //可能会有异常的代码
}catch(异常对象){
   // 出现异常之后执行的代码
}finally{
    //无论是否出现异常都执行
}
public static void main(String[] args) {
		int[] a={1,2,3};
		try {
			System.out.println(a[10]);
			
			/*System.out.println(a[0]);
			return;finally依然执行
			System.exit(0);终止当前运行的jvm finally不执行*/
			
			System.out.println("找到错误就跳转到catch 不继续执行");
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("捕获异常的代码"+e.getMessage());//打印异常信息
			e.printStackTrace();//打印异常详细信息
		}finally {
			System.out.println("是否捕获到异常 都执行finally语句");
			//关闭数据库代码 或 关闭相关资料
		}
		
		System.out.println("其他代码");
	}

 try:是必须的,catch和finally至少要跟一个

catch可以有多个,用来捕获不同类型的异常

public class throw_throws {

	public static void main(String[] args){
		
		//!throws 主方法中try
		try {
			test01();//不往主函数抛出方法
		} catch (ParseException e) {
			System.out.println("解决throws的"+e.getMessage());
		}
		
		
		//!!throw在函数内部手动抛出异常
		test03(1, 0);
		
		
		//自定义抛出类
		try {
			test04(300);
		} catch (AgeException e) {
			System.out.println("年龄超了");
			e.printStackTrace();
		}
		
	}
	
	
	//!通过throws关键词声明方法中存在异常
	public static void test01() throws ParseException{
		SimpleDateFormat day = new SimpleDateFormat("yyyy-mm-dd");
		Date parse = day.parse("2022/01/22");
	}

    //!调用有异常的方法 可以继续抛
	public static void test02() throws ParseException{
		test01();
	}

	
	//!!通过throw在函数内部手动抛出异常
	public static int test03(int a1,int a2){
		if(a2==0){
			throw new ArithmeticException("手动抛出异常啊啊啊啊啊啊啊除数不可以为0");
		}
		return a1/a2;
	}

	
	//自定义异常
	public static void test04(int age) throws AgeException{
		if(age>200){
			throw new AgeException(age);
		}
		
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		if(age>200){
			throw new AgeException(s);
		}
		
		
	}	
}


//自定义年龄异常类  当前类属于异常的子类
class AgeException extends Exception{
	public AgeException(int s){
		System.out.println(s);
	}
	
	/*public AgeException(int s){
		super(s);//调用父类方法进行输出
	}*/
	
	public AgeException(String s){
		if(!s.matches("[0-9]")){//正则表达式 是否符合输入格式
			System.out.println("非法字符");
		}
	}
}

throws:存在异常时,可以暂时不出来,由方法的调用者来处理。

(1)throws用来声明方法中会抛出的异常

(2)throw用来在方法中手动抛出异常

6.自定义异常

自定义异常类时,需要继承Exception类或是它的子类

一般继承Exception 和 RunTimeException

* 如果继承Exception ,则表示自定义的异常类为检查异常,必须处理(外抛/try...catch)
* 如果继承的RunTimeException,则为运行时异常,可以不处理

7.方法重写的异常问题

(1)父类的方法中不抛出异常,子类方法不能抛出异常
(2)父类的方法抛出异常,子类可以不抛
(3)重写的方法不能抛出比父类异常范围更大的异常 

class A {
	public void show() throws ArithmeticException{
		System.out.println("show()");
		}
}

class B extends A{
	@Override
	public void show() {
		super.show();
	}
}

这是一边看视频一边学习的笔记-借用了部分老师的笔记内容-如有侵权,通知删除!

新手小白学习之路~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值