精华内容
下载资源
问答
  • try代码与日志

    2018-12-26 15:41:09
    存在 try 时,可以只有 catch 代码,也可以只有 finally 代码,就是不能单独只有 try 这个光杆司令。 finally 是在 return 表达式运行后执行的。此时return 的结果已经被暂存起来 。finally 代码执行结束...

     

    异常分类

    有return的情况下try catch finally的执行顺序

        try语句在返回前,将其他所有的操作执行完,保留好要返回的值,而后转入执行finally中的语句,而后分为以下三种情况:

        情况一:如果finally中有return语句,则会将try中的return语句”覆盖“掉,直接执行finally中的return语句,得到返回值,这样便无法得到try之前保留好的返回值。

        情况二:如果finally中没有return语句,也没有改变要返回值,则执行完finally中的语句后,会接着执行try中的return语句,返回之前保留的值。

        情况三:如果finally中没有return语句,但是改变了要返回的值,这里有点类似与引用传递和值传递的区别,分以下两种情况,:

            1)如果return的数据是基本数据类型或文本字符串,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。

            2)如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。

     

    try 代码块

           try-catch-finally 是处理程序异常的三部曲。当存在 try 时,可以只有 catch 代码块,也可以只有 finally 代码块,就是不能单独只有 try 这个光杆司令。

           finally 是在 return 表达式运行后执行的。此时return 的结果已经被暂存起来 。finally 代码块执行结束后再将之前暂存的结果返回。

           finally代码块的职责不在于对变量进行赋值等操作,而是清理资源、释放连接、关闭管道流等操作,此时如果有异常也要做 try-catch。

           finally 代码块中使用 return语句,使返回值的判断变得复杂,所以避免返回值不可控,我们不要在 finally 代码块中使用 return 语句。

           分析try代码块与锁的关系,lock 方法可能会抛出 unchecked 异常。如果放在try代码块中,必然触发 finally 中的 unlock 方法执行。对未加锁的对象解锁会抛unchecked 异常Illega!MonitorStateException。 虽然是因为加锁失败而造成程序中断的,但是真正加锁失败的原因可能会被后者覆盖。所以在try代码块之前调用lock()方法,避免由于加锁失败导致 finally 调用 unlock()抛出异常。将lock.lock()移到 try代码块的上方。

    Lock lock= new XxxLock();
    preDo ();
    try {
        //无论加锁是否成功. unlock都会执行,
        lock.lock();//移到try代码块之上
        doSomething();
    } finally {
        lock .unlock();
    }

     

    日志规范

           推荐的日志文件命名方式为 appName_logType logName.log 其中 logType日志类型,推荐分类有 stats 、monitor 、isit等。 logNam 为日志描述。这种命名的好处是通过文件名就可以知道曰志文件属于什么应用,什么类型 ,什么目的,也有利于归类查找。例如: mppserv 应用中单独监控时区转换异常的日志文件名定义为

    mppserver _monitor_ timeZoneConvert.log。

           记录曰志时要思考三个问题:①日志是否有人看 ②看到这条日志能做什么 ③能不能提升问题排查效率。

     

    日志框架

           日志框架分为三大部分,包括日志门面、曰志适配器、日志库。利用门面设计模式,即 Facade 来进行解耦,使日志使用变得更加简单。

           门面设计模式是面向对象设计模式中的一种。日志框架采用的就是这种模式。类似JDBC的设计理念。它只提供一套接口规范 自身不负责日志功能的实现。目的是让使用者不需要关注底层具体是哪个日志库来负责日志打印及具体的使用细节等。目前用得最为广泛的曰志门 面有两种slf4j和commons-logging。

           日志库具体实现了日志的相关功能。主流的日志库有三个分别是 log4j,log-jdk,logback。最早 Java 要想记录曰志只能通过Syste. out 或者System. error来完成非常不方便。log4j 就是为了解决这一问题而提出的。它是最早诞生的曰志库。接着 JDK也在 1.4版本引入了一个日志库 java. util.logging. Logger简称log-jdk。这样市面上就出现两种功能的实现。开发者在使用时需要关注所使用的日志库的具体细节。 logback 是最晚出现的,它与log4j 出自同一个作者,是log4j的升级版且本身就实现了slf4j的接口。

           如果是新工程,则推荐使用slf4j+logback 模式。因为 logback 自身实现了slf4j的接口,无须额外引人适配器,另外 logback是log4j 的升级版,具备比 log句更多的优点,可通过如下配置进行集成。

           如果是老工程,则需要根据所使用的日志库来确定门面适配器,通常情况下老工程使用的都是 log4j 。因此以 log4j 日志库为例,可通过如下配置进行集成

           如果老代码中直接使用了 log4j日志库提供的接口来打印曰志,则还需要引人曰志库适配器,配置实例如下所示

           至此我们的工程就完成了日志框架的集成,再加上一个日志配置文件(如logback.xml、log4j.xml 等),并在工程启动时加载,然后就可以进行曰志打印了,示例代码如下

           注意 logger 被定义为 static 变量,是因为这个 logger 与当前类绑定 避免每次都new 一个新对象,造成资源浪费,甚至引发 OutOfMernoryError 问题。

           另外,在使用 slf4j+日志库模式时,要防止日志库冲突,一旦发生则可能会出现日志打印功能失效的问题。例如,某个业务的网站页面出现了 500 错误。但开发工程师翻遍整个系统的日志文件都没有发现任何异常曰志。线下模拟调试发现错误发生时有异常对象抛出并被框架捕获,然后执行了曰志打印的相关代码,但实际没有输出到日志文件。经开发工程师深入排查,当前工程代码中配置的曰志库为 log4j 但工程依赖的 一个jar包间接地引入了 logback 日志库,导致打印日志的 Logger 引用实际指向 ch.qos.logback.classic Logger 对象,二者的冲突引发了日志打印失效的问题。

    展开全文
  • try、catch、finally 块的关系 try块不能单独存在,后面必须跟catch块或者finally块。...一个try块可以有多个catch块,从上到下多个catch块的范围从小到大。 转载于:https://www.cnblogs.com/...

    try、catch、finally 块的关系

     

     

    • try块不能单独存在,后面必须跟catch块或者finally块。
    • 三者之间的组合为:try-catch、try-catch-finally、try-finally 这几种组合是合法的。
    • 一个try块可以有多个catch块,从上到下多个catch块的范围从小到大。

    转载于:https://www.cnblogs.com/muyuge/p/6152020.html

    展开全文
  • try、catch、finally块的关系  (1):try块不能单独存在,后面必须跟catch块或者finally块 (2):三者之间的组合为:try—catch 、try—catch—finally 、 try—finally 这几种...(3):一个try块可以有多个ca
    try、catch、finally块的关系                                                      
    (1):try块不能单独存在,后面必须跟catch块或者finally块
    (2):三者之间的组合为:try—catch 、try—catch—finally 、  try—finally 这几种是合法的
    (3):一个try块可以有多个catch块,从上到下多个catch块的范围为从小到大
    1:try块                                                                                  
    try块由一组可执行语句组成,在执行它们时可能会抛出异常。try块后可随一个或多个catch块,用来捕获在try中抛出的异常。另一方面,try不可以跟随在catch块之后。
    也就是说:在try语句块中包含可能会产生异常的语句
    int demo=0;
    try{
      System.out.println(20/demo);
    }
    语句 System.out.println(20/demo);//会抛出一个异常,原因是试图用0去除一个数。程序会被成功编译,但当运行该程序时,程序将会发生异常而中断,异常可在catch块中被捕获,try块可以嵌套:
    try{
    statement 1;
    statement 2;
    try{
    statement 1;
    statement 2;
    }catch(Exception e){
      //异常处理
    }
    }catch(Exceptione){
       //异常处理
    }
       try块嵌套时,首先执行内部的try块,该块中引发的任何异常在随后的catch中被捕获;如果未发现与该内部块匹配的catch块,则检查外部try块的catch块;如果发现匹配的catch块,那么在该块中处理这一异常,否则Java运行时环境(JRE)处理这一异常。
     
    2:catch块                                                                                
    catch块,从其名称就可以看出,是用来捕获并处理try中抛出的异常的代码块。没有try块,catch块不能单独存在,我们可有多个catch块,以捕获不同类型的异常。下面是catch块的语法
    try{
        }catch(异常类型  e){
        }
    这里,e是异常类型类的对象,利用这一对象,我们可以输出这一异常的详细信息
    下面是catch/try块的一个简单示例:
    class TryClass{
        public static void main(String args[]) {
          int demO=0;
    try{
            System.out.println(20/demO);
        }catch(ArithmeticException a){
            System.out.println(“Can not divided by zero”);
        }
      }
    }
        上述程序的输出结果是:Can not devided by zero
    注意:当多个catch块存在的时候,从上往下catch异常的范围应该从小到大,因为catch块的运行机制是找到一个匹配的就进行处理了,如果把范围大的放在前面,那么后面的代码就没有机会运行了,这会是一个编译异常,示例如下:
    比如下面这个是正确的:
    public  class Test {
      public static void main(String[] args) {
      try{
        int i = 5/0;
       }catch(ArithmeticException  e){
          e.printStackTrace();
       }catch(Exception err){
          err.printStackTrace();
        }   
      }
    }
    而下面这个就是错误的了,编译都发生了错误:
    public  class Test {
      public static void main(String[] args) {
      try{
        int i = 5/0;
       }catch(Exception err){
          err.printStackTrace();
       }catch(ArithmeticException  e){
          e.printStackTrace();
        }   
      }
    }
     
    3:finally块                                                                        
    finally块表示:无论是否出现异常,都会运行的块
    通常在finally块中可以编写资源返还给系统的语句,通常,这些语句包括但不限于:
       (1):释放动态分配的内存块:
       (2):关闭文件;
       (3):关闭数据库结果集;
       (4):关闭与数据库建立的连接;
    它紧跟着最后一个块,是可选的,不论是否抛出异常,finally块总会被执行。
    finally块的语法如下:
    try{
    }catch(异常类型1  e){
    }catch(异常类型2  e){
    }finally{
    }
    下面的程序显示的是finally块的使用
    public class Test {
      static String name;
      static int n01, n02;
      public static void main(String args[]) {
      try {
        name = "Aptech Limited";
        n01 = Integer.parseInt(args[0]);
        n02 = Integer.parseInt(args[1]);
          System.out.println(name);
          System.out.println("Division is" + n01 / n02);
        } catch(ArithmeticException i) {
          System.out.println("Can not be divided by zero!");
        } finally {
        name = null;
          System.out.println("finally executed");
        }
      }
    }
    您从下面的命令行执行此程序:
    Java Test 20 0
    将会得到下面的输出:
    Aptech Limited
    Can not be divided by zero!
    finally executed
     
    现在从下面的命令行执行此程序:
    Java Test 20 4
    则会得到下面这样的输出:
    Aptech Limited
    Division is 5
    finally executed
     
    说明:当您用不同的命令行参数执行此程序时,均会看见“finally executed”的输出这意味着,无论try块是否抛出异常,都会执行finally块。
     
    展开全文
  • 一、什么是异常 Java中把非正常情况分为两种:异常和...try-catch不允许存在单独try块或者catch块,可存在多个catch块。try块中存放业务功能代码,catch中存放异常处理代码。try-catch后可以添加finally,使用f...

    一、什么是异常

            Java中把非正常情况分为两种:异常和错误。

            错误一般是指与虚拟机相关的问题,这种错误无法恢复或不可能捕获。而对于异常我们可以用try-catch进行捕获。try-catch不允许存在单独的try块或者catch块,可存在多个catch块。try块中存放业务功能代码,catch中存放异常处理代码。try-catch后可以添加finally,使用finally可以保证除系统退出外fanally块中代码绝对执行。捕获异常时需要注意一定要先捕获小异常,再捕获大异常 ,否则小异常将无法捕获。

            * try { 
             *可能出现异常的代码
             *} catch(异常类名A e){ 
             *如果出现了异常类A类型的异常,那么执行该代码
            *} ...(catch可以有多个)
             * finally { 
              *最终肯定必须要执行的代码(例如释放资源的代码)
      *}

    代码执行的顺序:

           1、try内的代码从出现异常的那一行开始,中断执行

           2、执行对应的catch块内的代码

           3、继续执行try catch之后的代码

    注意:如果catch内的异常类存在子父类的关系,要子类在前,父类在后。如果最后中有返回语句,那么最终返回的结果肯定一最终中的返回值为准。如果最后语句中有回报,那么没有被处理的异常将会被吞掉。

     

    展开全文
  • 异常:try块:可能出现异常的代码块 try块不允许缺失 并且不允许单独存在可以配合catch finally块联合使用 前面2者出现任意一者也可以)catch块:针对try块中抛出的异常 进行处理finally块:无论如何 代码都会...
  • JAVA异常与异常处理重点 捕获异常try-catch-finally 1、try ... 捕获异常的第一步是用try{…}选定捕获异常的范围,由try所限定的代码块中的... 每个try代码块可以伴随一个或多个catch语句,用于处理try代码块
  • 异常的注意事项

    2018-06-06 19:40:07
    (2)try语句后既可以只使用catch语句,也可以只使用finally语句。当与catch语句一起使用时,可以存在多个catch语句,而对于finally语句只能存在一个。当catch与finally同时存在时,finally必须放在...
  • Java 捕获和抛出异常

    万次阅读 2019-05-08 19:59:59
    开发工具与关键技术:Java、MyEclipse 作者:邹赛 撰写时间:2019/5/6 Java中把非正常情况分为两种:异常(Exception)和错误(Error),...try…catch不允许存在单独try块或catch块,可存在多个catch块。tr...
  • java进行异常处理时的注意事项

    千次阅读 2017-01-03 22:02:48
    (2)try语句后既可以只使用catch语句,也可以只使用finally语句。当与catch语句一起使用时,可以存在多个catch语句,而对于finally语句只能存在一个。当catch与finally同时存在时,finally必须放在...
  • 1.不要单独使用try、catch或finally语句,否则编译出错。   2.try语句后既可以只使用catch语句,也可以只使用finally语句。当与catch语句一起使用时,可以存在多个catch语句,而对于finally语句...
  • yield不能单独放在try-catch块中,如果try中有yield那么,这个try块后面不许跟着finally块;也不能出现在匿名方法中,所以,看起来yield似乎并不常用,但是也不是不用。我前面有一个关于迭代器的例子《C#中的迭代器...
  • Python异常

    2018-11-30 23:49:26
    它是在程序异常时单独存在的一个对象,可以对其进行获取或其他操作 错误异常处理 try:  #尝试实现某个操作,  #如果没出现异常,任务就可以完成  #如果出现异常,将异常从当前代码扔出去尝试解决...
  • JSTL详细标签库介绍

    2010-11-01 16:37:44
    语句位置、try{}程序try()程序中直接和间接调用的方法中)<BR><BR>4、 java采用终止方式异常处理,不是恢复方式的异常处理<BR><BR>5、 发生异常时,异常周围信息(抛出对象本身类型)-------------异常处理...
  • java 面试题 总结

    2009-09-16 08:45:34
    声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其...
  •  Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常...
  • 而 GoF 的设计模式是在这方面开始探索的一里程碑。 J2EE 等属于一种框架软件,什么是框架软件?它不同于我们以前接触的 Java API 等,那些属于 Toolkist(工具箱),它不再被动 的被使用,被调用,而是深刻的介入到...
  • 存在web中样式的继承。 刚开始接触的同学就类比于react中扯的,一切皆为组件吧,其实widget是对页面UI的一种描述。他功能类有点似于android中的xml,react中的jsx。widget在渲染的时候会转化成...
  • C# 2.0 版引入了匿名方法的概念,此类方法允许将代码作为参数传递,以代替单独定义的方法。 【面试题库网整理 .net 面试题(附答案)(三)】 22.您要创建一个显示公司员工列表的应用程序。您使用一个...
  • 集合 集合的使用 集合可以看成是可以随意添加的数组,因此凡是在使用数组的场合,都可以 使用集合。而且集合的元素可以是任意对象,操作也比数组灵活的多。 使用集合时,必须注意集合的生命期问题。如果有两个集合 ...
  • asp.net知识库

    2015-06-18 08:45:45
    消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和方法的学习小结 C#中结构与类的区别 C#中 const 和 ...

空空如也

空空如也

1 2
收藏数 22
精华内容 8
关键字:

try块可以单独存在