zoukankan      html  css  js  c++  java
  • 异常



    1. 异常


    • 程序在运行过程中难免会发生错误,为此Java提供了异常处理机制来帮助程序员检查可能出现的错误,对于可能出现的异常都需要预先进行处理

    • 异常也是一个对象,包含了错误信息和处理方法,有的需要手动捕获或抛出称为受检异常(Checked Exception),有的虚拟机自动进行捕获,编译时期通过,处理称为免检异常

    • 异常继承图:

    其中Exception及其子类(不包括RuntimeException)是必须捕获的异常

    Error及其子类,RuntimeException及其子类是不需要捕获的


    • 常见异常
    异常名 解释
    VirtualMachineError 虚拟机异常
    ReflectionError 反射异常
    Error
    IOException IO流异常
    DataFormatException 日期格式日常
    Exception
    ArithmeticException 算术异常
    IndexOutOfBoundsException 下标越界
    NullPointerException 空指针
    ClassCastException 类型转换异常
    RuntimeException


    2. 异常处理


    捕获

    try catch finally,把要捕获异常的语句放到try里面

    public static void main(String[] args) {
    	
    	try {
    		
    		ExceptionTwo();				//会发生算数异常
    		System.out.println("try");
    		
    	}catch (RuntimeException e) {
    		
    		System.out.println("run");
    		e.printStackTrace();		//打印方法调用栈
    		
    	} catch (Exception e) {
    		
    		System.out.println("ex");
    		
    	}finally{
    		
    		System.out.println("finally");
    		
    	}
        
        System.out.println("我是异常下面的语句");
        
    }
    
    static void ExceptionTwo() {
    	ExceptionOne();
    }
    
    
    static void ExceptionOne() {
        int a = 1/0;		//算数异常
    }
    
    run
    java.lang.ArithmeticException: / by zero
    	at exception.Test.ExceptionOne(Test.java:36)
    	at exception.Test.ExceptionTwo(Test.java:31)
    	at exception.Test.main(Test.java:11)
    finally
    我是异常下面的语句
    
    • 发生异常后不执行异常后面的语句,直接跳转catch,最后一定会执行finally(除非用exit,不然return之后也会执行finally里面的语句)

    • 可以有多个catch语句,但要子类放前面,父类放后面,但如果异常不是继承关系,catch条件里面可以用 '|' 逻辑运算符

    • 当执行完finally会继续往finally下面的语句执行

    • 调用顺序从打印语句来看是从下往上,main函数调用ExceptionTwo,ExceptionTwo调用ExceptionOne,ExceptionOne里面有算数异常

    • finally中有return,前面的return失效,直接在finally中返回


    抛出

    throws在方法声明中抛出,throw在方法体内抛出

    当某个方法抛出异常时,如果当前方法没有捕获,异常就会被抛到上层调用方法,直到遇到某个try ...catch被捕获为止

    创建异常一般使用匿名函数方式

    public static void main(String[] args) {
    	
    	try {
    		ExceptionOne();			//这里被向上抛出的异常需要捕获,或者继续向上抛出
    	} catch (FileNotFoundException e) {
    		e.printStackTrace();
    	}
    }
    
    
    static void ExceptionOne() throws FileNotFoundException {
        File file = new File("D:test.txt");
        FileOutputStream fs = new FileOutputStream(file);//会抛出文件异常,但在方法声明中用了throws向上抛出
    }
    
    public static void main(String[] args) throws Exception {
    	
    	int a = 1; 
    	if (a < 2){
    		throw new Exception("a小于2了");	//一般继承Exception,然后使用构造函数
    	}
    }
    

    打印

    public class Test {
    	
    	public static void main(String[] args) {
    		
    		Logger logger = Logger.getLogger(Test.class);
    		
    		try {
    			
    			int a = 1/0;		//会发生算数异常
    			
    		}catch (RuntimeException e) {
    			
    			logger.error("测试异常",e);		//	使用log4j日志系统
    			
    		}
    	}
    }
    
    • logger.error(Object message); //只输出信息

    • logger.error(Object message,Throwable a); //输出堆栈

    如果不了解log4j,请戳这里



  • 相关阅读:
    hdu 2196 树形dp
    codeforces 1A
    [日常摸鱼]bzoj1218[HNOI2003]激光炸弹-二维前缀
    [日常摸鱼]bzoj2724蒲公英-分块
    [日常摸鱼]关于离散化
    [OI笔记]后缀自动机
    [日常摸鱼]poj1509Glass Beads-SAM
    [日常摸鱼]bzoj1083[SCOI2005]繁忙的都市-最小生成树
    [日常摸鱼]bzoj2038[2009国家集训队]小Z的袜子-莫队算法
    [日常摸鱼]三分法
  • 原文地址:https://www.cnblogs.com/Howlet/p/12100240.html
Copyright © 2011-2022 走看看