zoukankan      html  css  js  c++  java
  • [Java学习]异常

    一、异常

    异常基本概念

    • 异常用类表示,类的对象表示具体异常事件。
    • 当出现异常Java虚拟机会new一个异常对象。
    • 异常对象输出的异常信息,可以帮助我们完善程序,处理异常,使程序更健壮。

    异常继承关系结构图

    • Throwble有两个子类Error和Exception:错误不能处理,直接退出jvm;异常可以处理,但不处理也会退出jvm。
    • Exception的直接子类及直接子类的子类都是编译时异常,Exception的子类RuntimeException的子类是运行时异常。编译时异常指发生几率大的异常,运行时异常指发生几率小的异常。编译时异常需要程序员处理:两种方法:捕捉:try catch 、声明抛出:throw。

    二、处理异常的两种方法

    处理异常方法一:throws

    编译时异常示例
    • 因为FileInputStream的构造方法中抛出了 FileNotFoundException,所以能得到异常。而FileNOtFoundException 继承IOException,IOException直接继承Exception,所以这个异常是编译时异常。
    • 解决方法,可以在函数声明的地方throws相应异常。
    关于throws

    throws是向上抛,抛给调用它的,当主函数throws,编译阶段会通过,但运行会打印出异常信息,jvm虚拟机会结束程序。
    也就是,throws实际是在“推卸责任给上层”。

    处理异常的方法二:try catch

    语法
    try{
        语句
    }
    catch(异常类型1 变量名1){//JVM自动创建一个异常类型1的对象,将该对象的内存地址赋值给变量1。
        对异常1的处理
    }
    catch(异常类型2 变量名2){
        对异常2的处理
    }
    
    注意:
    • catch由上到下要是由小异常到大异常(子类到类)
    • 只会执行一个catch
    try catch底层实现

    catch是一个方法,异常类型的对象作为它的参数。

    调用异常对象的printStackTrace()或getMessage()来调试异常
    try{
        语句
    }
    catch(FileNotFoundException e){
        e.printStackTrace();//打印异常堆栈信息,信息更全,推荐。
        //e.getMessage();//打印异常描述信息
    }
    

    三、异常中的finally语句块

    finally

    finally语句块中的代码一定会执行,除非在try中exit(0)即退出了JVM。
    语法
    try{
    }
    finally{
    }
    
    try{
    }
    catch{
    }
    finally{
    }
    

    finally作用:把需要释放的资源写在finally里,保证资源一定被释放。

    区分完全无关的finally final finalize

    final关键字:在面向对象中提到,final修饰的类无法被继承,final修饰的方法无法被覆盖...
    finalize是object类的一个方法:垃圾回收机制在回收Java对象之前,会先调用对象的该方法。
    finally语句块:异常机制中的,见上。

    四、自定义异常

    例子

    package com.test.jinhj;
    
    //可以选择作为编译时异常还是运行时异常,这里继承Exception,所以是编译时异常
    public class UserNameShortException extends Exception {
    	public UserNameShortException() {}
    	public UserNameShortException(String message) {
    		super(message);
    	}
    }
    
    package com.test.jinhj;
    
    public class Register  {
    	public void register(String name) throws UserNameShortException{
    		if(name.length()<6) {
    			//手动抛出异常
    			throw new UserNameShortException("用户名必须大于6位!");
    		}
    		System.out.println(name);
    	}
    }
    
    package com.test.jinhj;
    
    public class RegisterTest {
    	public static void main(String[] args) {
    		Register person=new Register();
    		try {
    			String name="gaga";
    			person.register(name);
    		}
    		catch(UserNameShortException e){
    			e.printStackTrace();
    		}
    	}
    
    }
    

    异常机制与方法的覆盖

    (子类)重写的方法只能比(父类)被重写的方法抛出更“小”的异常 。???why

  • 相关阅读:
    code第一部分数组:第十七题 爬楼梯问题
    code第一部分数组:第十六题 数组表示数,加一操作
    code第一部分数组:第十五题 矩阵翻转(图像翻转)
    code第一部分:数组 第十四题 雨水问题
    code第一部分数组:第十题:移除数组中目标元素
    [java 2020-04-24] Maven多模块项目+SpringBoot,编译失败:程序包xxx不存在
    [java 2020-04-24] springboot生成的jar包没有主类和依赖jar包
    [java 2019-12-16] SimpleDateFormat格式化跨年显示格式错误
    [2019-11-22]马说
    [linux 2019-10-23] linux可以创建多少个用户
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/10533436.html
Copyright © 2011-2022 走看看