java 异常 日志_java中的异常、断言、日志(一)

1.Java异常处理i.异常的概念和Java里面的异常体系结构1)基本概念:程序中的异常,一般成为例外情况,可以理解为是非正常情况,其他编程语言里面也有这样的情况,Java里面同样存在这样一个体系结构,这里需要分清楚的是异常和错误不是一个概念。异常并非是真正的错误,因为他们是一些例外情况,这些情况有可能不会导致系统直接崩溃掉,但是它的存在只能说是程序的某种缺陷,或者说是非必然缺陷,而Java里面提供的异常体系结构就是为了解决这些缺陷而存在的。在异常处理机制诞生之前,传统的异常处理方式多数是为了采用返回值来标识程序出现异常的情况,这种方式都很熟悉,如同在调试过程即是有良好的调试工具,但是常用的手段就是System.out.println的方式,但是这样的方式隐含一定的缺点。[1]一个API可以返回任意的值,但是这些返回值本身不能解释返回值是否代表一个异常发生了,也不能描述异常的详细情况,若要知道该API出现异常的一些内容,还需要调用它的某些方法;[2]没有一种结构可以确保异常情况能够得到处理,如果使用第一种方法,就会使得代码的可读性很差,而且很多时候并不能因为某些情况的存在就终止程序,就程序本身而言是应该提供一定的反馈情况。假设这样一个场景,如果你去输入用户名和密码登陆,如果你的用户名和密码输入错误了,但是界面上没有任何反应,这种情况是不是很糟糕,当然这只是个比方,这里不一定是出现了异常。在开发过程中,当一个程序本身抛出了异常过后,程序会从程序导致异常的地方跳出来,在java语言里面,使用try和catch块来实现,当JVM碰到这个语句块的时候,它会监听整个Java程序,一旦出现了任何异常情况,它会将整个程序的执行权交给catch块来执行。先看一段简单的代码:import java.io.File;import java.io.FileReader;/***一个简单的文件操作**/public class CustomerFileReader{public static void main(String args[]){File file = new File("C:/read.txt");FileReader reader = new FileReader(file); //这句话不能通过JVM的编译器}}上边这段代码如果使用的是javac的命令,那么编译器就会报错,可能错误信息如下:unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown那么如果要保证上边这句代码是能够通过编译的,如何简单修改呢,有两种方式:[1]加入try和catch块,使用JVM的异常体系结构去捕捉该异常;[2]直接throws这个异常,让程序显式抛出该异常2)Java里面的异常体系结构:先看下边的异常体系结构图:Java里面的异常分类按照下边的结构来分:Throwable是所有异常的基类,程序中一般不会直接抛出Throwable对象,Throwable本身存在两个子类实例,一个是Error、一个是Exception;[1]Error:在Java里面Error表示程序在运行期间出现了十分严重的问题以及不可以恢复的错误,这种情况唯一的办法是中止程序运行,JVM一般不会检查Error是否被处理,而本身在程序中也不能捕获Error类型的异常,因为Error一旦产生,该程序基本会处于需要中止的状态。[2]Exception:在Java里面Exception指的就是在编程过程可能会遇到的异常的概念,也属于Java程序里面允许出现的例外的状况,而Exception本身分为以下两种:RuntimeException:该异常继承于Exception类,这种类型的异常可以这样理解,为不可估计的异常,一般称为运行时异常,从字面意思上讲就是在程序正式运行的时候会碰到的偶发性异常,这种异常因为是在运行时抛出一般情况下不需要进行捕获操作。CheckedException:该类异常不存在继承于Exception类的说法,因为Java里面没有CheckedException异常类,而之所以这样区分,因为CheckedException类的异常是在编程过程中经常会遇到的异常,可以翻译为“可检测异常”或者“捕获型异常”,该类异常往往属于编译期异常,一般开发过程会针对系统进行CheckedException的设计。【*:JVM在处理Java程序的时候,Runtime Exception和Checked Exception两种类型的异常在运行机制上是不一样的,而仔细考虑两种异常的使用场合也会发现,其两种异常在设计上所提及的使用目的也大相径庭。从程序开发角度可以这样理解:Checked Exception的设计目的在于这个Exception是必须被处理的,在程序设计过程应该知道这类异常会出现,所以要针对这一类型的异常进行不同的处理操作,这些异常也可以认为是在程序设计之初可以考虑到的异常;而RuntimeException可能理解起来隐晦一点,不能说不能考虑到这种异常的存在,反而是即使能够考虑到,也不能进行良性的程序处理,它往往是暗示着程序可能会出现某种错误,这种错误有可能根程序本身无关,也有可能有关,是在设计程序之初是无法预知处理方式的,而有时候甚至会造成程序中止的情况。】这里提供一个简单的关于RuntimeException的例子:public class RunExpTester{public static void main(String args[]){try{//……}catch(Exception ex){//……}}}考虑一下上边这段代码,上边这段代码使用了面对CheckedException的程序处理方式,使用了try和catch块来处理有可能存在的Exception,但是这样就出现了一个缺点:很可能不知道发生了什么异常,这些异常的源头,而且如果整个程序段里面还包含了必须处理的CheckedException,那么这种设计方法反而给开发带来了不必要的成本开销。一般情况下,在测试阶段,如果遇到了RuntimeException可以让它这样存在或者发生,然后再逐渐去修改的代码,让它尽量避免掉,否则面对任何一个Exception,都要确定不会轻易出现或者说更加完美一定不出现RuntimeException为之。这里提供一个常用的编程习惯作为参考,在使用Exception的catch过程的时候,一般可以这样来书写:catch(Exception ex){// TODO:书写该异常的说明ex.printStackTrace();}当然这种情况是使用IDE的时候的一种习惯,一般IDE都提供了TODO:标记,使用该标记和所有TaskList的前缀标记不仅仅可以在开发过程了解到底有多少地方存在手写的异常,而且在针对CheckedException的处理过程中,不是每一个异常都需要使用ex.printStackTrace()方法将该异常的堆栈信息全部打印出来,有时候需要在catch块里面书写更加实用的异常处理代码。3)深入了解Throwable类:【参考API文档】Throwable类是Java语言中所有错误(Error)或异常(Exception)的超类,只有当某个对象是该类的子类实例的时候,才能通过JVM或者Java本身编写过程的throw语句抛出,按照这种逻辑区判断,只有此类或者它的子类才可以是catch子句中的参数类型。Throwable类有两个子类Error和Exception,上边已经简单介绍过这两种类型的区别了。Throwable类本身包含:[1]线程创建的时候执行堆栈的快照[2]有关错误的消息字符串,比如该异常出现的位置以及代码里面的哪一行[3]它指出了这个异常的原因:该异常是由哪个异常导致的或者说是由哪个异常抛出的Throwable导致的这个Throwable的产生从JDK 1.4开始,出现了一个异常处理的新概念:异常链(Cause机制)。异常链机制可以这样理解:如果某个程序出现了异常,那么该异常本身也会有个原因,这个原因可能是自身的,也可能是外界的,以此类推就形成了一个异常链,简单讲:每个异常都是由另外一个异常引起的。而什么内容导致了throwable cause呢,查阅官方的API文档有以下两种解释:[1]导致throwable cause的一个理由是,抛出它的类构建在低层抽象之中,而高层操作由于低层操作的失败而失败。让低层抛出的throwable向外传播是一种糟糕的设计方法,因为它通常与高层提供的抽象不相关。此外,这样做将高层API与其实现细节关联起来,假定低层异常是经过检查的异常。抛出“经过包装的异常”(即包含cause的异常)允许高层与其调用方交流失败详细信息,而不会招致上述任何一个缺点。这种方式保留了改变高层实现而不改变其 API 的灵活性[2]导致throwable cause的另一个cause是,抛出它的方法必须符合通用接口,而通用接口不允许方法直接抛出cause。例如,假定持久集合符合Collection接口,而其持久性在java.io的基础上实现。假定add方法的内部可以抛出IOException。实现可以与其调用方交流IOException的详细消息,同时通过以一种合适的未检查的异常来包装IOException,使其符合Collection接口。4)特殊类AssertionError:这里提供一段代码:public class AssertionErrorTester{public static void main(String args[]){try{assert args.length < 0:"Args Length Error!";}catch(AssertionError e){String message = e.getMessage();System.out.println("Error Source:" + message);}}}【*:这里需要提及的一个异常类是AssertionError类,因为上边已经讲过了,所有的Error都是不能进行catch的处理的,但是AssertionError属于一个比较特殊的类,因为JVM针对AssertionError类是可以进行catch处理的,该Error和普通的Error可能存在本质的区别】使用断言编译方式编译以上代码,然后打开断言执行该编译好的class文件,会出现以下输出:Error Source:Args Length Error!关于如何使用断言编译以及断言本身的使用规则在断言章节会涉及到,这里先不做详细讲解ii.异常的基本语法前边介绍了Java异常体系结构、分类以及基本概念,这一小节需要介绍的就是Java里面异常的基本语法。在Java里面,异常处理机制的编程部分需要使用到几个关键字:try、catch、finally、throw、throws1)try、catch、finally关键字:/***测试Exception关键字的代码**/public class ExceptionTester{public static void main(String args[]){//这一块被成为异常的正常执行块,也就是如果没有异常抛出的话,try块会一直这样正常执行到最末位try{//判断输入参数的长度if( args.length == 0 ){System.out.println("Args length is zore");}else{String inputString = args[0];int inputNumber = Integer.parseInteger(inputString);System.out.println("Input number is " + inputNumber);}}//这一块是异常处理块,一旦当try代码块里面抛出了异常的时候,直接从try块中断,直接进行catch代码块的执行catch(Exception ex){ex.printStackTrace();}//finally代码块,不论try中是否抛出异常,也不论catch里面是否真正能够捕捉到异常,finally里面的代码都会执行(有例外)finally{System.out.println("Testing finishing...");}}}这段代码出现了三个关键字,try、catch、finally,这里先对这三个关键字简单讲解:try语句:该语句块属于代码的正常执行块,如果这段代码里面不会出现任何异常,那么try语句块会按照顺序一直执行下去catch语句:该语句块的参数类似于平时在代码书写中的方法声明,包含了一个异常类型以及一个异常对象。这里结合第一节讲到的,异常类型必须是Throwable的子类型,它指出了catch语句处理的异常类型,异常对象则有可能在try语句块里面生成,而且被对应的catch块里面的异常类型所捕获,大括号里面的内容就是当你捕获了对应的异常过后如何进行处理。在异常处理里面,catch语句块可以有多个,分别处理不同的异常。Java运行的时候一旦抛出了异常就从catch块从上往下检索,一旦匹配对应的类型就执行catch块里面的内容,所以这里有一点需要注意:catch块里面的异常类型的顺序,一般情况是从特殊到一般,然后是从子类到父类,否则会造成代码不可达的无用代码块finally语句:该语句块可以指定一个段代码块,不论try块也好、catch块也好,也不论异常是否抛出,最终都会执行finally块里面的内容,可以这样理解:finally块里面是异常处理机制的统一出口,只要存在这样的一段代码块最终出口都是执行完finally块里面的内容了再继续。【*:但是有一个特殊的情况,如果try块里面出现了return语句,那么finally块里面的内容是不会执行的,但是这种做法不提倡。】2)throw、throws关键字:import java.io.File;import java.io.FileReader;import java.io.IOException;/***提供throw和throws关键字的代码块**/public class ThrowInstance{public static void main(String args[]) throws Exception{try{readFile("C:/read.txt");}catch(IOException ex){throw new Exception(ex);}}public static void readFile(String path) throws IOException{File file = new File(path);FileReader reader = new FileReader(file);}}从上边这段代码理解throw和throws关键字:throw关键字:throw关键字总是出现在函数体内部,用来抛出一个异常,程序会在throw语句后立即终止执行,也就是说位于throw语句之后的语句块不会执行,一旦它抛出了一个异常过后,JVM会在包含它的try块所对应的catch里面根据抛出的异常类型匹配操作,如果能匹配就直接被捕捉,一旦不能匹配就继续往执行体的外层抛出该异常。throws关键字:throws关键字总是出现在函数头部,用来表明该函数有可能会抛出某种异常,有几点需要注意:[1]函数可以抛出多个不同类型的异常,直接使用,将每种抛出的不同异常分开;[2]如果函数体里面存在throw语句,而且函数体本身没有进行捕捉的话,那么必须使用throws在函数头里面添加对应的异常抛出语句,否则无法通过编译[3]如果编写代码的时候需要明确抛出一个RuntimeException,那么必须显示使用throws语句来声明它的类型[4]以上的规则主要是针对CheckedException,针对Error和RuntimeException或者它们的子类,这些规则不起作用3)关键字的搭配:try+catch:这是常用的代码结构,这种情况类似下边这种情况:/***try+catch语句块**/public class TryCatch{public static void main(String args[]){try{//正常执行语句块}catch(Exception ex){//抛出异常过后的异常捕捉语句块,捕捉到异常了就执行}}}这种语句块的执行流程为:运行try块中的代码,如果有异常抛出,就会转到catch语句块中执行,当然前提是catch中的异常类型和try块中抛出的异常类型匹配。try+catch+finally/***try+catch+finally语句块**/public class TryCatch{public static void main(String args[]){try{//正常执行语句块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Phoenix] 十、全局索引设计实践

概述 全局索引是Phoenix的重要特性&#xff0c;合理的使用二级索引能降低查询延时&#xff0c;让集群资源得以充分利用。 本文将讲述如何高效的设计和使用索引。 全局索引说明 全局索引的根本是通过单独的HBase表来存储数据表的索引数据。我们通过如下示例看索引数据和主表数…

云原生数据库崛起,阿里云POLARDB当选世界互联网领先科技成果

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 晶少责编 | 阿秃10月20日&#xff0c;在第六届世界互联网大会上&#xff0c;阿里云自研数据库POLARDB当选世界互联网领先科技成果&#xff0c;POLARDB解决了企业在云时代的数据库难题&#xff0c;帮助企业在数小时内完成上云…

【基于XML方式】Spring整合Kafka

文章目录1.引入Maven依赖2. kafka.properties文件中配置内容3. 发送端 producer-kafka.xml 配置4. 接收端 consumer-kafka.xml 配置5. kafka消息监听类6. Controller的实现7. 测试8. 项目链接&#xff1a;1.引入Maven依赖 <!-- 添加spring-kafka支持 --> <dependency…

使用CLI进行高速跨域日志复制、历史数据重新索引与数仓投递

背景 使用日志服务是不是常常遇到如下烦恼&#xff1f; 开启了字段索引却无法对历史日志起作用&#xff0c;而手动重建索引又很困难怎么办&#xff1f;需要迁移数据&#xff0c;复制数据到其他区域logstore&#xff0c;写代码实现大并发复制又很复杂怎么办&#xff1f;投递日…

java map大小_Java中HashMap的size()方法: HashMap.size() - Break易站

Java中的HashMapHashMap类的java.util.HashMap.size()方法用于获取哈希映射HashMap中映射的大小&#xff0c;该映射引用Map中键值对或映射的数量。句法&#xff1a;Hash_Map.size()参数&#xff1a;该方法不接受任何参数。返回值&#xff1a;该方法返回映射的大小&#xff0c;这…

gitee提交代码_git 版本控制,github和gitee

3.4 git 版本控制# 查看本地状态git status # 修改README.txt &#xff0c;添加一行,保存&#xff0c;添加到暂存区git add README.txt # 查看当前仓库某一个文件的版本git diff README.txt# 提交到本地仓库git commit README.txt -m second Commit# 查看当前仓库某一个文件版本…

IT 拉呱室 | 论我遇到的最刺激的bug【长期福利站】

戳蓝字“CSDN云计算”关注我们哦&#xff01;套路的最高境界是没有套路&#xff1a;这是一个只送福利的长期互动栏目【如果你们让我尴尬&#xff0c;我就哭给你们看】。书籍、键盘、鼠标、鼠标垫、CSDN 20周年纪念T恤、技术沙龙门票、线上公开课名额……你敢一直在&#xff0c;…

“百变”Redis带你见识不同场景下的产品技术架构

2018飞天技术汇24期-云数据库Redis产品发布会&#xff0c;由阿里云数据库技术组技术专家王欢、怀听、梁盼分别带来以“Redis全球多活产品”、“Redis混合存储产品”、“Redis多线程性能增强版”为题的演讲。本文对Redis进行了简单的介绍&#xff0c;进而针对不同的应用场景研制…

【基于注解方式】Spring整合Kafka

文章目录1. 添加Maven依赖2. 配置与参数分离3. 工具类度内容4. Producer 消息生产者配置5. Consumer 消息消费者配置6. 使用注解监听消息7. 请求测试8. 测试结果1. 添加Maven依赖 <!-- 添加spring-kafka支持 --> <dependency><groupId>org.springframework.…

阿里云PyODPS 0.7.18发布,针对聚合函数进行优化同时新增对Python 3.7支持

近日&#xff0c;阿里云发布PyODPS 0.7.18&#xff0c;主要是针对聚合函数进行优化同时新增对Python 3.7支持。 PyODPS是MaxCompute的Python版本的SDK&#xff0c;SDK的意思非常广泛&#xff0c;辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做“SDK”。 PyODPS在这…

centos安装rabbitmq_【SpringBoot MQ系列教程】RabbitMq 初体验

SpringBoot 系列教程之 RabbitMq 初体验​mp.weixin.qq.commq 在异步解耦削峰的优势非常突出&#xff0c;现在很多的项目都会用到&#xff0c;掌握 mq 的知识点&#xff0c;了解如何顺畅的使用 mq&#xff0c;可以说是一个必备的职业技能点了接下来我们进入 rabbitmq 的学习过程…

java rpc与webservice_RPC体系,RPC和WebService的区别详解

RPC和WebService的关系RPC(Remote Procedure Call)— 远程过程调用&#xff0c;是一个很大的概念, 它是一种通过网络从远程计算机程序上跨语言跨平台的请求服务&#xff0c;rpc能省略部分接口代码的开发&#xff0c;可以跨机器之间访问对象(java rmi)&#xff0c;可以有更方便的…

免费公测中-GPU数据库SQream DB正式上线云市场

业内领先的GPU 数据库服务SQream DB在阿里云云市场正式开启免费公测&#xff01;SQream DB是一款由阿里战略投资的以色列SQream公司提供&#xff0c;能够支撑海量数据高速分析的业内领先的GPU数据库。通过将计算密集型操作卸载到GPU上&#xff0c;与业界的解决方案相比&#xf…

唏嘘!2019榜单出炉:铁打的Python连续3年第一,它居然跌出前十?

IEEE Spectrum2019年度编程语言排行榜最近刚刚出炉&#xff0c;Python不出意外的又拿了个第一&#xff0c;但是意料之外的是&#xff0c;曾经大火的PHP&#xff0c;居然跌出了前十&#xff01;PHP曾被大家称为“世界上最好的编程语言”&#xff0c;去年排名第六&#xff0c;前年…

centos7无法使用epel的解决方法

使用如下代码在centos7安装epel源&#xff0c;却无法使用。 yum -y install epel-release网络没问题&#xff0c;可以ping通epel源的地址&#xff0c;但是就是连不上repo&#xff0c;报错。 解决方法&#xff1a;编辑/etc/yum.repos.d/epel.repo&#xff0c;将epel配置信息中…

阿里云ECS家族再添新成员,推出密集计算型实例规格族ic5

去年&#xff0c;阿里云正式发布云服务器ECS企业级产品家族&#xff0c;推出面向173种企业应用场景的19款实例。适合在复杂的企业计算环境下&#xff0c;满足对于高性能、高可靠的计算需求。 时隔近一年&#xff0c;回看ECS企业级产品家族已经发展到30款实例&#xff0c;近日再…

findbugs插件_Intellij静态代码扫描插件SpotBugs

最近要做Java静态扫描的部分工作&#xff0c;之前是在Jenkins上使用findbugs插件完成的&#xff0c;但是由于现在Jenkins权限收回和Java代码权限的放开(我也搞不懂这两者的关联性)&#xff0c;目前打算在本地完成静态代码扫描工作。选来选取还是选择在Intellij中用插件来完成&a…

一张图看懂智联车管理云平台

智联车管理云平台&#xff08;IoV Command Center&#xff0c;简称IoV CC&#xff09;是阿里云面向智联车领域&#xff0c;专门推出的车辆全生命周期云端管理平台&#xff0c;旨在赋能车厂转型出行服务商&#xff0c;提高运营效率、降低自建成本。 传统模式下&#xff0c;车辆…

刨根问底 | 红遍全网的SD-WAN,到底是个啥?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 小枣君责编 | 阿秃作为一个热门概念&#xff0c;SD-WAN近年以来频繁地出现在我们的视野当中。很多人说&#xff0c;它是未来最具发展潜力的通信技术之一&#xff0c;极具商业价值。行业里的老牌通信设备商和运营商对它一致看…

centos7安装rabbitmq简单方式

安装rabbitmq前要准备的基础环境 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel tk tc xz tcp_wrappers需下载的安装文件如下 ## erlang wget www.rabbitmq.com/releases/erlang/erlang-18.3-1.…