首页 > 其他分享 >动手动脑1多层的异常捕获

动手动脑1多层的异常捕获

时间:2022-10-22 21:14:23浏览次数:55  
标签:捕获 动脑 System 多层 try println finally catch out

1.

package text;

public class text { 
    public static void main(String[] args) { 
        try { 
            	try { 
                	throw new ArrayIndexOutOfBoundsException(); 
            	} 
            	catch(ArrayIndexOutOfBoundsException e) { 
               		System.out.println(  "ArrayIndexOutOfBoundsException" +  "/内层try-catch"); 
            	}
 
            throw new ArithmeticException(); 
        } 
        catch(ArithmeticException e) { 
            System.out.println("发生ArithmeticException"); 
        } 
        catch(ArrayIndexOutOfBoundsException e) { 
           System.out.println(  "ArrayIndexOutOfBoundsException" + "/外层try-catch"); 
        } 
    } 
}

运行结果:

 

2.

package text;

public class text { 
    public static void main(String[] args) { 
        try {
                try { 
                    throw new ArrayIndexOutOfBoundsException(); 
                } 
                catch(ArithmeticException e) { 
                    System.out.println( "ArrayIndexOutOfBoundsException" + "/内层try-catch"); 
                }
            throw new ArithmeticException(); 
        } 
        catch(ArithmeticException e) { 
            System.out.println("发生ArithmeticException"); 
        } 
        catch(ArrayIndexOutOfBoundsException e) { 
            System.out.println( "ArrayIndexOutOfBoundsException" + "/外层try-catch"); 
        } 
    } 
}

运行结果:

 

 当有多个嵌套的try…catch…finally时,要特别注意finally的执行时机。

3.

package text;

public class text {

    
    public static void main(String args[]) {
        
        int result;
        
        try {
            
            System.out.println("in Level 1");

           
             try {
                
                System.out.println("in Level 2");
  // result=100/0;  //Level 2
               
                 try {
                   
                     System.out.println("in Level 3");
                      
                     result=100/0;  //Level 3
                
                } 
                
                catch (Exception e) {
                    
                    System.out.println("Level 3:" + e.getClass().toString());
                
                }
                
                
                finally {
                    
                    System.out.println("In Level 3 finally");
                
                }
                
               
                // result=100/0;  //Level 2

            
                }
            
            catch (Exception e) {
               
                 System.out.println("Level 2:" + e.getClass().toString());
           
             }
             finally {
                
                System.out.println("In Level 2 finally");
           
             }
             
            // result = 100 / 0;  //level 1
        
        } 
        
        catch (Exception e) {
            
            System.out.println("Level 1:" + e.getClass().toString());
        
        }
        
        finally {
           
             System.out.println("In Level 1 finally");
        
        }
    
    }

}

2.运行结果

 

 

 总结:当有多层嵌套的finally时,异常在不同的层次抛出 ,在不同的位置抛出,可能会导致不同的finally语句块执行顺序。

*处理运行异常时,尽量避免,并且尽量用try-catch来辅助。

*在多重catch快后可以加catch(Excetion)来处理遗漏

*对于不确定的也可一加try-catch

*尽量添加finally语句去释放占用的资源,并且finally语句是类似栈来进行释放的。

*还有finally语句不一定执行。

 

二、throw语句

throws语句表明某方法中可能出现某种(或多种)异常,但它自己不能处理这些异常,而需要由调用者来处理。 当一个方法包含throws子句时,需要在调用此方法的代码中使用try/catch/finally进行捕获,或者是重新对其进行声明,否则编译时报错。

throws语句中声明的异常称为受控(checked)的异常,通常直接派生自Exception类。 RuntimeException(其基类为Exception) 和Error(基类为Throwable)称为非受控的异常。这种异常不用在throws语句中声明。 CheckedExceptionDemo.java示例展示了上述两种异常的特性。

 

 

 

 

 

 

 三、以上都是前辈们总结出来的公用的抛出异常,我们在实际应用开发中应该自定义异常与异常处理链。

 

建议:

* 在中间层组件中抛出异常,在界面层组件中捕获异常在底层组件中捕获JVM抛出的“只有程序员能看懂的”异常,转换为中间层的业务逻辑异常,再由界面层捕获以提供有意义的信息。

* 自身能够处理的异常,不要再向外界抛出。

* 尽可能地在靠近异常发生的地方捕获并处理异常

* 尽可能地捕获最具体的异常类型,不要在中间层用 catch(Exception)“吃掉”所有异常

 *在开发阶段捕获并显示所有异常信息,发布阶段要移除部分代码,以避免“过于专业”的异常信息困扰用户,特别地,系统发布之后,不要将服务端异常的详细信息发给客户端,以免被黑客利用

标签:捕获,动脑,System,多层,try,println,finally,catch,out
From: https://www.cnblogs.com/zhaoyueheng/p/16817267.html

相关文章

  • Vue学习笔记之Element-UI表单校验中的多层嵌套处理
    0x00概述本文主要记录VUE页面Element-UI表单校验中的多层嵌套处理。 0x01Element-UI表单校验中多层嵌套<el-row:gutter=20class="with-bg"v-for="(product,idx......
  • 动手动脑
    importjavax.swing.*;classAboutException{publicstaticvoidmain(String[]a){inti=1,j=0,k;k=i/j;try{......
  • 动手动脑——异常处理
    1.动手动脑importjavax.swing.*;classAboutException{publicstaticvoidmain(String[]a){inti=1,j=0,k;k=i/j;try{......
  • Java第四讲动手动脑
    1.  在以上的代码中,main方法调用的是publicvoidprintln(Objectx),这一方法调用了String类的valueOf方法,valueOf方法内部调用Object.toString方法:1publicString......
  • 多层嵌套 promise then 执行顺序
    在看js事件循环的时候,看到一个有趣的promisethen执行顺序的题,想了好久,终于想明白了,这里记录一下。 大家先想下这里的执行顺序是什么。newPromise(resolve=>{......
  • 输入捕获原理与配置
    一、通用定时器输入捕获概述1.STM32输入捕获工作过程2.STM32输入捕获工作过程(通道1为例)通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将......
  • Promise 捕获程序中的失败
    代码varA=newPromise(function(resolve,reject){console.log('dosth.');setTimeout(()=>{console.log('~~~~~');resolve('ok');//reject......
  • ARM 笔记(1018)-- STM32部分--14 通用定时器输入捕获
    12.4通用定时器输入捕获输入捕获的概念:输入捕获是什么意思?怎样实现的输入捕获?输入捕获捕获的是跳跃的信号,根据硬件连接关系,按键按下是上升沿,按键抬起是下降沿。如果想......
  • 异常捕获,生成器对象
    异常常见类型SyntaxError》》语法错误NameError》》名称错误IndexError》》索引错误KeyError》》字典键错误IndentationError》》缩进错误异常处理语法结构1.基......
  • 进入python的世界_day16_python基础——异常捕获的处理、生成器对象、生成器表达式
    一、异常捕获1.错误类型语法错误>>>syntaxerror名字错误>>>namerror索引错误>>>Indexerror缩进错误>>>indentationerror等等......2.异常处理语法结构1.语法结......