写在前面很早写的一篇文章,这里分享给小伙伴。在项目中,我们会遇到异常处理,对于运行时异常,需要我们自己判断处理。对于受检异常,需要我们主动处理。主动处理中繁琐的try{}caht嵌套在代码里,看着很不舒服这里我们不讨论性能,就代码来讲,来看看如何将他隐藏起来。原理是不变的。变得是写法。下面我们来看如何优雅的处理异常块。 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。王小波在这之前,你需要知道以下几个概念:行为参数化: 是java8提出的,函数式编程的一种思想,通过把代码包装为参数传递行为,即把代码逻辑包装为一个参数,传到方法里。Lambda表达式 java8提出:Lambda表达式理解为简洁的表示可传递的匿名函数的一种方式,它没有名称,但它有函数体,参数列表,返回类型。可以抛出一个异常类型。包装代码逻辑为参数即使用Lambda表达式。函数式接口: 本质上是只有一个抽象方法的普通接口,可以被隐式的转换为Lambda表达式,需要用注解定义(FunctionalInterface)。 这里需要注意一点默认方法和静态方法虽然不属于抽象方法,但是可以在函数式接口中定义。FunctionalInterfacepublicinterfaceObjectMethodFunctionalInterface{voidcount(inti);StringtoString();sametoObject。toStringinthashCode();sametoObject。hashCodebooleanequals(Objectobj);sametoObject。equals} 如果函数式接口中额外定义多个抽象方法,那么这些抽象方法签名必须和Object的public方法一样,接口最终有确定的类实现,而类的最终父类是Object。因此函数式接口可以定义Object的public方法。 即行为参数化是指导思想,Lambda表达式是表达方式,函数式接口是实现手法如何隐藏C?clazzClass。forName(类名); 这句代码想来小伙伴都不陌生。这是一个受检异常,需要抛出一个ClassNotFoundException。正常的写法:try{C?clazzOldClass。forName(类名);}catch(ClassNotFoundExceptione){e。printStackTrace();}隐藏之后的写法:C?clazzNewclassFind(oClass。forName(o),类名); 嗯,我们来看具体的实现:很简单,我们要做的,即把C?clazzClass。forName(类名);当做一种行为去处理,接受一个String,得到一个Class,所以我们要定义一个函数接口,描述这种行为,这种行为本身是需要处理受检异常的。Auther:LiruilongDate:202072915:50Description:由函数名获取元类Class实例函数签名:StringClassFunctionalInterfacepublicinterfaceClassFindInterface{C?classNametoClass(StringclassName)throwsClassNotFoundE} 这里,因为我们的行为需要抛出异常。所以在接口里也抛出异常。 然后,我们需要定义一个方法,将我们的行为作为参数传进去,同时,捕获一下我们的异常。publicClassclassFind(ClassFindInterfaceclassFindInterface,StringclassName){C?try{clazzclassFindInterface。classNametoClass(className);}catch(ClassNotFoundExceptione){logger4j。error(。。。、e。getMessage());e。printStackTrace();}} 然后,我们可以调用我们的方法classFind方法,C?clazzNewclassFind(oClass。forName(o),类名); 当然。其实这种思想并不简单的可以做捕获异常的处理,我们来看一个Demo 文本文件转换为字符串: 在我看来;将文本文件转换为字符串,我们需要使用高级流包装低级流,然后做缓存读出来。这里,我们不可避免的会遇到异常处理,流的关闭等操作,下面我们将这些代码都异常起来。专心写读的逻辑即可。 我的思路: 我对javaIO用的不是很熟,大家有好的方法请留言,相互学习:FileInputStreamfileInputStreamnewFileInputStream(file))InputStreamReaderinputStreamReadernewInputStreamReader(fileInputStream))BufferedReaderbufferedReadernewBufferedReader(inputStreamReader))StringstrbufferedReader。readLine() 字节流》字符流》字符缓存流即将字节流转换为字符流之后在用高级流包装。 所以我的思路是避免在逻辑里出现太多的IO流关闭,和异常捕获,专心处理读取逻辑即可,结合以下两种技术:try(){}【自动关闭流,1。7支持】lambda特性来实现【行为参数化,1。8】 描述一个行为,BufferReaderStringpackagecom。liruilong。demotext。service。utils。importjava。io。BufferedRimportjava。io。IOEDescription:函数接口,描述BufferedReaderString的转化方式Author:LiruilongDate:202031715:44FunctionalInterfacepublicinterfaceInputStreamPeocess{AuthorLiruilongDescription方法签名BufferedReaderStringDate15:472020317Param〔inputStream〕returncom。liruilong。demotext。service。utils。InputStreamStringpeocess(BufferedReaderbufferedReader)throwsIOE} 执一个行为,嵌入到定式里,任何BufferReaderString的Lambda表达式都可以作为参数传入。只要符合peocess方法的签名即可。returnjava。lang。StringAuthorLiruilongDescription环绕处理Date17:142020317Param〔inputStreamPeocess,file〕publicstaticStringfileToBufferedReader(InputStreamPeocessinputStreamPeocess,Filefile){try(FileInputStreamfileInputStreamnewFileInputStream(file)){try(InputStreamReaderinputStreamReadernewInputStreamReader(fileInputStream)){try(BufferedReaderbufferedReadernewBufferedReader(inputStreamReader)){resoultinputStreamPeocess。peocess(bufferedReader);}}}catch(IOExceptione){e。printStackTrace();}finally{}} 如何使用这个定义好的行为returnjava。lang。StringAuthorLiruilongDescription文件转字符串Date17:222020317Param〔file〕publicstaticStringreadJsonToString(Filefile){returnfileToBufferedReader((bufferedReader){SStringBuilderstringBuildernewStringBuilder();while((strbufferedReader。readLine())!null){stringBuilder。append(str);}returnstringBuilder。toString();},file);} 关于Java中try{}catch的隐藏就和小伙伴分享到这里