Java.异常


概念

  • 在程序运行过程中出现的错误,称为异常。异常就是程序运行过程中出现了不正常现象导致程序的中断。在Java中,把各种异常现象进行了抽象形成了异常类
  • 异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。
  • 程序错误分为三种:
    • 编译错误:程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置。
    • 运行时错误:程序在执行时,运行环境发现了不能执行的操作。
    • 逻辑错误:程序没有按照预期的逻辑顺序执行。

异常分类

  • 异常类结构(不完整):
Object Throwable Error Exception IOException RuntimeException
  • 通常,Java的异常分为受查异常(checked exceptions)和非受查异常(unchecked exceptions)。
  • 受查异常: 包括Exception及其子类(不包括运行时异常,即RuntimeException与其子类),这种异常的特点是Java编译器会检查它,必须处理后才能通过编译。
  • 非受查异常: 包括运行时异常(RuntimeException与其子类)和Error,表示程序中出现了编程错误,应该找出错误修改程序。

异常处理机制

  • try:监控区域,执行可能产生异常的代码,不能单独出现。当try块中有语句引发异常时,系统将不再执行try块中未执行的语句,而执行匹配的catch块。

  • catch:捕获、处理异常。一般按照由小到大的顺序捕获,也就是先截获子异常,再截获父异常。

  • finally:善后处理,无论是否发生异常,代码总能执行。finally必须和try一块使用。

  • 如果在catch中遇到了return或者异常等能使该函数终止的话那么有finally就必须先执行完finally代码块里面的代码然后再返回值。

  • 一般格式:

    try {
    	
    	} catch (OneException e) {
    	     
    	} catch (TwoException e) {
    	
    	} finally {
    	
    	}
    

    或者:

    try {
    	
    	} catch (OneException e1|TwoException e2) {  //从小到大用|隔开
    	
    	}finally {
    	
    	}
    
  • 示例:

    
    class Person{
    	String name;
    }
    
    public class Test {
    	public static void main(String[] args) {	
    		Person p = null;
    		try{			
    			p.name = "我是一个不能赋值给null的字符串";			
    		}catch(java.lang.NullPointerException e1){ //捕获指针异常
    			System.out.println("空指针异常");				
    		}finally{
    			System.out.println("end1");
    		}
    		
    		try{
    			System.out.println(100 / 0);
    		}catch(Exception e2){ //捕获所有异常
    			System.out.println("0不能作为分母出现!请回小学补习算术");	
    		}finally{
    			System.out.println("end2");
    		}
    	}
    }
    
    
  • 输出:

    空指针异常
    end1
    0不能作为分母出现!请回小学补习算术
    end2	
    

异常抛出

  • throw用于手动抛出异常,作为程序员可以在任意位置手动抛出异常

  • throws用于在方法上标识要暴露的异常,抛出的异常交由调用者处理

  • throw用在方法内,后面跟上要抛出的异常类对象;throws修饰在方法上,告诉调用者此方法可能会抛出异常,后面跟上要抛出的异常类名

  • 示例:

    class Bar{
    	int age;
    	public Bar(int age){
    		this.age = age;
    	}
    	void check()throws IllegalArgumentException{ 	//throws 声明标识可能出现的异常
    		if(age < 18){
    			throw new IllegalArgumentException("年龄不符合要求");	//throw 抛出异常
    		}
    	}
    	
    }
    
    public class Test {
    	public static void main(String[] args) {	
    		Bar b = new Bar(15);
    		try{
    			b.check();
    		}catch(IllegalArgumentException e){
    			System.out.println(e.getMessage()); //打印返回异常的详细消息字符串
    			e.printStackTrace(); //追踪堆栈异常信息
    		}
    		System.out.println("end");
    	}
    }
    
    
  • 输出:

    年龄不符合要求
    end
    java.lang.IllegalArgumentException: 年龄不符合要求
    	at Bar.check(Test.java:8)
    	at Test.main(Test.java:18)
    

自定义异常

  • 自定义异常类必须从已有的异常类继承

  • 建立新的异常类型最简单的方法就是让编译器产生默认构造方法

  • 对异常来说,最重要的部分就是它的类名

  • 可以为异常类定义一个接收字符串参数的构造方法,字符串参数描述异常信息

  • 格式:

    public class CustomException extends Exception {
    
    	//无参构造方法
    	public CustomException(){
    		
    		super();
    	}
    	
    	//有参的构造方法
    	public CustomException(String message){
    		super(message);
    		
    	}
    	
    	// 用指定的详细信息和原因构造一个新的异常
    	public CustomException(String message, Throwable cause){
    		
    		super(message,cause);
    	}
    	
    	//用指定原因构造一个新的异常
    	 public CustomException(Throwable cause) {
    		 
    		 super(cause);
    	 }
    	
    }
    
    
  • 示例

    class Bar{
    	int age;
    	public Bar(int age){
    		this.age = age;
    	}
    	void check()throws myException{ 
    		if(age < 18){
    			throw new myException("年龄不符合要求");	
    		}
    	}
    	
    }
    
    class myException extends Exception{
    	
    	private String message;
    	public myException(String message){
    		super(message);
    	}
    }
    
    public class Test {
    	public static void main(String[] args) {	
    		Bar b = new Bar(15);
    		try{
    			b.check();	
    		}catch(myException e){
    			System.out.println(e.getMessage());
    			e.printStackTrace();
    		}
    		System.out.println("end");
    	}
    }
    
    
  • 输出:

    年龄不符合要求
    myException: 年龄不符合要求
    	at Bar.check(Test.java:8)
    	at Test.main(Test.java:26)
    end
    

❤️ 本回完! ❤️ ❤️ ❤️

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

money的大雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值