Java基础---异常、解决异常、自定义异常

本文详细介绍了Java中的异常处理机制,包括异常的分类(Error和Exception)、异常处理的关键字(try-catch-finally-throws)以及如何通过声明和捕获异常来妥善处理程序运行时可能出现的问题。同时,还展示了自定义异常的创建和使用,帮助开发者更好地管理和解决程序异常。
摘要由CSDN通过智能技术生成

1.异常

1.1 异常

  • java.lang 包中的类或接口直接使用

  • 概念:指程序在执行的过程中出现了非正常的情况,最终JVM终止工作

  • 异常的体系:

    java.lang.Object
    	java.lang.Throwable  Throwable是Error和Exception的基类(父类)
    		java.lang.Error:表示出现严重错误 .jvm的错误,通过程序无法解决
    		java,lang,Exception:表示异常类,异常产生后可以通过代码解决
    			编译时异常:程序在编译时出现的异常   javac.exe
    			运行时异常:程序在运行时出现的异常   java.exe
    

1.2 解决异常

  • 异常中所用到的关键字: try catch finally throw throws
    • throw 抛出异常

      • 作用:可以在方法内用throw 手动抛出异常
      • 格式:throw new xxxException(“异常的消息”)
      • 注意:
        • throw 写在方法内
        • throw后面的异常类型 一定是Exception 类型或它的子类型
        • throw 抛出的异常必须要处理
          • 如果throw后面写的异常类型是编译时异常必须要处理(1. throws 2.try…catch)
          • 如果throw后面写的运行时异常 可不处理该异常
        • throwable:有两个方法来获取异常消息
          • getMassage() 获取详细消息字符串
          • printStackTrace() 打印堆栈跟踪的信息(异常消息多)
    • throws 解决异常的第一种方式

      throws: 声明式异常(自己不处理异常,有其他调用该方法的用户处理)

      • 格式:返回值类型 方法名称(参数)throws XxxException{ }

      • 注意:throws后面写的异常类型必须是Exception或者是它的子类型,可以写多个异常的类型,也可以只用一个父的异常类型

        throws声明什么样的异常,调用者也要解决或者声明什么异常

      public class TestThrows {
      	public static void main(String[] args) throws Exception { // 没有解决但是声明异常了   就交给jvm处理
      		readFile("c:/a.txt");
      	}
      	public static void readFile(String fileName) throws FileNotFoundException,Exception {  //1声明异常之后将异常抛给调用者
      		if(fileName.equals("c:/a.txt")) {
      			throw new FileNotFoundException("文件未找到");
      		}
      		if(fileName.endsWith("txt")) {
      			throw new Exception("文件类型不匹配");
      		}
      	}
      }
      
    • try…catch 解决异常的第二种方式

      try…catch:捕获异常

      • 格式:写在方法中

        try{ 可能会出现的异常代码 }catch( 捕获的异常类型 对象){ 捕获异常 }

        可以有多个catch块

      • 注意:

        try块中如果有异常,try块后面的代码不执行,此时会跳转到catch块

        多个代码块异常,catch块先写子类再写父类,也可以只用父类异常

        public class TestTryCatch {
        	public static void main(String[] args) { // 没有解决但是声明异常了   就交给jvm处理
        		try {
        			readFile("c:/a.txt");
        			System.out.println("try块后面的代码");
        			
        		} catch (FileNotFoundException e) {
        			System.out.println(e.getMessage());
        		} catch (Exception e) {
        			System.out.println(e.getMessage());
        		}
        	}
        	public static void readFile(String fileName) throws FileNotFoundException,Exception {  //1声明异常之后将异常抛给调用者
        		if(fileName.equals("c:/a.txt")) {
        			throw new FileNotFoundException("文件未找到");
        		}
        		if(fileName.endsWith("txt")) {
        			throw new Exception("文件类型不匹配");
        		}
        	}
        }
        
    • finally

      不论有没有异常,finally块中的代码始终会执行(除非jvm结束)

      • 格式:try{ 可以会发生的代码 }catch(异常类型 e){ 捕获异常}finally{无论有无异常,都会执行}
      • 注意
        • finally块不能单独使用 一般和try块使用
        • finally块一般用于释放资源
      public class TestFinally {
      	public static void main(String[] args) {
      		show();
      	}
      	public static void show() {
      		try {
      			System.out.println("try");
      			System.exit(0);  //jvm正常结束  0  非正常结束 1或者-1
      		}catch(Exception e){
      			System.out.println("catch");
      		}finally {
      			System.out.println("finally");
      		}
      	}
      }
      

1.3 自定义异常

  • 自定义异常类型,必须继承Exception或RuntimeException

  • 定义注册异常类,实现用户不能重复注册

    public class TestRegister {
    	//现有的用户信息
    	static String[] names=new String[] {"jack","李涛","GEM"};
    	public static void main(String[] args) {
    		try {
    			reg("jack");
    		} catch (RegisterException e) {
    			System.out.println(e.getMessage());
    		}
    		System.out.println("结束");
    	}
    	public static void reg(String name) throws RegisterException {
    		for(String n : names) {
    			if(name.equals(n)) {
    				throw new RegisterException(n+"已被注册");
    			}
    		}
    	}
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Bromide-0

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

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

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

打赏作者

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

抵扣说明:

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

余额充值