.Java中的异常、断言、日志【草稿下,Log4j专题】
Logging Framework)
http://labs.xiaonei.com/apache-mirror/logging/log4j/1.2.15/apache-log4j-1.2.15.zip
http://apache.etoak.com/logging/log4j/1.2.15/apache-log4j-1.2.15.zip
Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。 此外,通过Log4j其他语言接口,您可以在C、C++、.Net、PL/SQL程序中使用Log4j,其语法和用法与在Java程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。
name)方法获取
Appender:
和用于 SMTP 服务器的 SMTP appender。
Layout:
org.apache.log4j.config:用来设置或者获取某些组件的相关属性
- 下载log4j的jar包,上边已经提供了下载地址
- 将这些包解压到一个目录里面,【*:一般对于开发人员最好将jar的包分类放在不同的目录下边方便使用。】
- 将包下边的log4j-1.2.15.jar放入开发的CLASSPATH里面,关于Java里面CLASSPATH的一些问题留到开发用Java里面去讲解
- 还需要下载两个辅助解析XML的jar,下载地址http://archive.apache.org/dist/xml/xerces-j/,这里我下载的最新版本2.9.0,取出里面的xercesImpl.jar和xml-apis.jar两个jar文件放到CLASSPATH里面。【*:在IDE环境下有专程针对CLASSPATH的设置,这种情况防止jar冲突最好的方式就是保持CLASSPATH里面只有java标准的环境】
- TRACE:这种细粒度信息时间不仅仅针对调试,
- DEBUG:指出细粒度信息事件对调试应用程序是非常有帮助的,该级别的日志主要用于辅助开发人员调试;
- INFO:该级别表明消息上细粒度上突出强调了应用程序的运行过程
- WARN:表明有可能会出现潜在错误的情形
- ERROR:表明虽然程序发生了错误事件,但是仍然不影响系统的继续运行
- FATAL:该级别表明了每个严重的错误时间,将会导致应用程序的退出。
- ALL:这是最低级别,用于打开所有的日志记录
- OFF:这是最高级别,用于关闭所有的日志记录
从上图可以知道,只有当日志记录器Logger的日志级别高于或者等于输出消息的等级的时候,该日志消息才会被输出。默认情况下,Logger的级别是Debug,如果我们需要创建一个Logger,有以下几种方式:
new Logger("MyLogger");
new Logger(MyClass.class);
org.susan.java.logging;
org.apache.log4j.Level;
org.apache.log4j.Logger;
Foo{}
Log4jLevelTester {
main(String args[]){
WARN >= INFO
DEBUG < INFO
org.susan.java.logging;
org.apache.log4j.BasicConfigurator;
org.apache.log4j.Level;
org.apache.log4j.Logger;
Foo{}
Log4jLevelTester {
main(String args[]){
WARN >= INFO
DEBUG < INFO
[2]Log4j中的Appender:
- ConsoleAppender:这种Appender会管理我们的日志消息,将日志事件记录到控制台以System.out或者System.err作为输出机制,它默认的输出为System.out;
- RollingFileAppender:这种Appender从FileAppender继承过来,大部分属性和FileAppender是类似的,当日志记录的文件到达文件容量的最大值的时候,会自动创建一个新的日志文件
- FileAppender:将日志输出到普通文本文件【这里有点需要说明,好像从版本1.2开始该Appender将会标记为禁用,替代的方案为该类的类:WriterAppender和ConsoleAppender】
- DailyRollingFileAppender:该Appender从FileAppender继承而来,能够按照一定的频度滚动日志记录文件
- WriterAppender:根据用户的选择将日志的信息以数据流的方式发送到任何用户指定的地方
- SMTPAppender:在特殊的事件日志发生的时候,发送一封Email到指定的邮件地址,一般情况下是针对ERROR级别以及FATAL级别的错误进行这种Appender的配置
- SocketAppender:将发送一个LoggingEvent对象到一个远程的日志服务器,一般情况下是一个SocketNode对象
- SocketHubAppender:将发送一个LoggingEvent对象的集合到一个远程的日志服务器,一般情况下是一个SocketNodes
- SyslogAppender:将日志记录消息发送到配置好的一个syslog远程服务器上
- TelnetAppender:该Appender和SocketHubAppender类似,也是向服务器发送日志信息,但是不是一个SocketNode对象或者SocketNode对象列,一般发送的是Category【1.1版】输出的结果。
org.susan.java.logging;
org.apache.log4j.AsyncAppender;
org.apache.log4j.BasicConfigurator;
org.apache.log4j.ConsoleAppender;
org.apache.log4j.Logger;
org.apache.log4j.TTCCLayout;
AsyncLogging {
Logger logger = Logger.getLogger("org.susan.java.logging.AsyncLogging");
AsyncAppender asyncAppender = null;
ConsoleAppender consoleAppender = null;
AsyncLogging(){
new AsyncAppender();
new TTCCLayout("yyyy-MM-dd");
new ConsoleAppender(layout,"System.out");
doLogging(){
main(String args[]){
new AsyncLogging();
org.susan.java.logging;
org.apache.log4j.AsyncAppender;
org.apache.log4j.ConsoleAppender;
org.apache.log4j.Logger;
org.apache.log4j.TTCCLayout;
AsyncLogging {
Logger logger = Logger.getLogger("org.susan.java.logging.AsyncLogging");
AsyncAppender asyncAppender = null;
ConsoleAppender consoleAppender = null;
ConsoleAppender consoleAppender2 = null;
AsyncLogging(){
new AsyncAppender();
new TTCCLayout("yyyy-MM-dd");
new ConsoleAppender(layout,"System.out");
new TTCCLayout("yyyy-MM-dd");
new ConsoleAppender(layout1,"System.err");
doLogging(){
main(String args[]){
new AsyncLogging();
- 重写方法getConnection()来获取我们需要的连接,重写该方法主要是启用应用程序的连接池
- 重写closeConnection(Connectoin con)方法,如果我们重写了getConnection方法,那么应该重写closeConnection方法用来关闭我们所需要的连接,或者说将不使用的连接放入到我们需要的连接池里面
- 重写getLogStatement(LoggingEvent event)方法用来生成动态的语句,默认情况下我们直接使用SQL语句的可选值。
org.susan.java.logging;
org.apache.log4j.Logger;
NTEventTester {
main(String args[]){
= FATAL,stdout
从截图可以看到,该事件的源为org.susan.java.logging.NTEventTester,也就是我们自己将这条记录写入到事件查看器里面去的。
org.susan.java.logging;
org.apache.log4j.Logger;
EmailLogging {
main(String args[]){
= WARN,stdout
- 如果发送的是SocketNode,而且这种情况下,会实现日志记录的实时同步。换句话说,这些事件日志会在同一个时间戳进行记录,而且在这种情况下,有些日志会在本地被本地客户端保存下来。
- SocketAppender在使用过程中不需要使用Layout,它会直接把LoggingEvent对象序列化到服务器上
- 远程日志记录使用TCP协议,因此如果服务器是可达到的,那么事件日志最终将直接被送到服务器上
- 如果远程服务器出了问题,发送日志记录的请求将会暂停。尽管如此,如果当服务器恢复正常的时候,日志记录将会继续发送该请求,当能够继续连接服务器的时候,这种重连接会被一个connector线程启动。
- 事件日志将会被本地TCP实现进行缓冲存储。意思就是如果连接到服务器的速度很慢但是比日志记录产生日志的速度快的时候,该日志记录客户端将不会因为网速很慢而受影响;但是如果网速很慢比起日志记录客户端产生日志的速度都慢的时候,该日志记录客户端只能使用该网速的速录来进行日志记录。
- SocketAppender若不关联到任何类型,它将不会被connector线程内的垃圾回收器回收。而且connector线程仅仅会在服务器出问题的情况下才会存在,为了避免垃圾回收的问题,我们应该在编程过程中显示调用close()方法,
- 如果JVM主机的SocketAppender在它显示关闭或者被垃圾回收器回收之前退出,这种情况下可能使得数据通道里面的数据丢失,这是Windows系统的一个常见问题。所以为了避免数据丢失,最好是在该应用程序退出之前显示调用SocketAppender的close()方法或者直接调用LogManager.shutdown()方法。
- HTMLLayout:输出为HTML的表格方式,如果没有指定编码格式的话,该输出的编码格式为UTF-8或UTF-16
- SimpleLayout:输出为最简单的格式,仅仅打印一个“Level名 - 日志记录信息”,例如:“DEBUG - Hello World”
- DataLayout:该类是一个抽象类,主要是通过可选项来定制输出,该类有一个子类TTCCLayout
|—TTCCLayout:TTCC的格式主要包含了时间、线程、分类、嵌套内容信息,这四个内容都是可以通过人为编程的方式进行关闭和打开的,时间格式依赖DateFormat类
176
[main] INFO
org.apache.log4j.examples.Sort
- Populating an array of 2 elements in reverse order.
225 [main] INFO
org.apache.log4j.examples.SortAlgo - Entered the sort method.
262 [main] DEBUG
org.apache.log4j.examples.SortAlgo.OUTER i=1 - Outer loop.
276 [main] DEBUG
org.apache.log4j.examples.SortAlgo.SWAP i=1 j=0 - Swapping intArray[0] = 1 and intArray[1] = 0
290 [main] DEBUG
org.apache.log4j.examples.SortAlgo.OUTER i=0 - Outer loop.
304 [main] INFO
org.apache.log4j.examples.SortAlgo.DUMP - Dump of interger array:
该Layout的第一个字段是该程序执行的时间,以毫秒为单位,第二个字段主要输出的执行的线程,其次是相关日志记录的登记,第四个字段是该语句出现的位置以及相关类型。最后一个字段表示嵌套内容相关信息
【*:不要在不同的Appender里面使用同一个TTCCLayout实例,因为TTCCLayout是非线程安全的,最好的用法是一个Appender使用唯一的一个TTCCLayout实例。】
org.susan.java.logging;
org.apache.log4j.ConsoleAppender;
org.apache.log4j.Logger;
org.apache.log4j.NDC;
org.apache.log4j.TTCCLayout;
TTCCLayoutDemo {
Logger logger = Logger.getLogger("TestTTCC");
ConsoleAppender appender = null;
TTCCLayout layout = null;
TTCCLayoutDemo()
new TTCCLayout("yyyy-MM-dd");
new ConsoleAppender(layout,"System.out");
computeSquareRoot(double number){
+ sqrt);
main(String args[]){
new TTCCLayoutDemo();
- XMLLayout:该Layout会按照XML格式输,其定义文件为log4j.dtd,该格式化输出输出的不是一个标准的良好格式的XML文档,一般格式如下:
<?xml version="1.0"
?>
<!DOCTYPE log4j:eventSet
SYSTEM "log4j.dtd"
[<!ENTITY data SYSTEM "abc">]>
<log4j:eventSet vertion="1.2"
xmlns:log4j="http://jakarta.apache.org/log4j/">
&data;
</log4j:eventSet>
该格式输出的编码一般是UTF-8或者UTF-16 - PatternLayout:这是Layout里面相对复杂的一个Layout这种情况下日志的格式是由模式字符串来进行设置的,主要依赖全局的format方法来格式化一个LoggingEvent然后通过模式转化将日志的格式输出,输出结果是需要依赖模式转换的
模式参数 | 用法描述 | 举例 |
%c | 列出logger名字空间的名称 | 假设当前logger的名空间为“org.java.susan.logging” %c——org.java.susan.logging %20c——若名空间长度小于20的时候,则左边用空格填充 %-20c——若名空间长度小于20的时候,右边填充空白 %.40c——若名空间长度超过40就截去多余的字符 %20.40c——若名空间小于20,左边用空白填充,如果超过40就截去多余字符 %-20.40c——若名空间小于20,右边用空白填充,如果超过40就截去多余字符 %c{2}——susan.logging %c{4}——org.java.susan.logging |
%C | 列举出logger的类全名(包含包路径) | 假设当前类是org.java.susan.logging.PatternTester %C——org.java.susan.logging.PatternTester %C{1}——PatternTester |
%d | 显示日志记录的时间,{<日期格式>}使用ISO8601定义的日期格式 | %d{yyyy/MM/dd HH:mm:ss,SSS}—— 2009/9/17 13:25:22,134【最后三位为毫秒】 %d{ABSOLUTE}——13:25:22,134 %d{DATE}——17 Sep 2009 13:25:22,134 %d{ISO8601}——2009-9-17 13:25:22,134 |
%F | 显示调用的logger的源文件名 | %F——PatternTester.java |
%l | 输出日志事件发生的位置,包括类目录、发生线程,以及在代码中的行数 | %l——PatternTester.fun(PatternTester.java:45) |
%L | 输出日志事件发生的代码行 | 45 |
%m | 显示输出消息 | %m——该消息输出的主要目的是为了进行Debug操作 |
%M | 显示调用logger的方法名 | %M——fun |
%n | 当前平台下的换行符 | %n——表示换行 |
%p | 显示该日志的优先级 | %p——INFO |
%r | 显示从程序启动时到记录该条日志时已经经过的毫秒 | %r——1435 |
%t | 输出产生该日志事件的线程名 | %t——PatternTester |
%x | 按NDC顺序输出日志 | 假设某线程调用顺序是MyDriver调用了org.java.susan.logging.PatternTester %c %x - %m%n——MyDriver - Call org.java.susan.logging.PatternTester - Log in PatterTester MyDriver - Return to MyDriver |
%X | 按MDC输出日志。通常用于多个客户端连接同一台服务器,方便服务器区分是哪个客户端访问留下来的日志。 | %X{5}——(记录代号为5的客户端日志) |
%% | 显示一个百分号 | %%——% |
[%t] %-5p %c %x - %m%n",日志记录的级别为Level.DEBUG,代码说明上边已经用到过了。
A1
输出优先级,DEBUG,INFO,WARN,ERROR,FATAL
输出自应用启动到输出该log信息耗费的毫秒
输出所属的类,通常就是在所在类的全名
输出产生该日志事件的线程名
输出一个回车换行,Windows为“/r/n”,Unix平台为“/n”
输出日志的时间点的日期或者时间,格式为ISO8601,也可以使用%d{yyyy MM dd}格式化输出
输出日志发生的位置,包括类名、线程以及代码中的行
org.apache.log4j.ConsoleAppender
= org.apache.log4j.TTCCLayout
= org.apache.log4j.PatternLayout
= WARN,SMTP
= FATAL,NTEVENT
= FATAL,ROLLING_FILE
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
= INFO,SOCKET
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.LocationInfo=true
log4j.appender.SOCKET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
= INFO,DATABASE
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/db_rect
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=********
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
【例:DailyRolling日志记录配置】
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
- Log接口:
实现该接口的实例可以被LogFactory顺利创建和初始化,如果某一个日志记录想要初始化必须调用一个带String单参数的构造函数,传入的语意为该日志记录器的名称
Log接口定义了日志的几个登记,所有实现该接口的类都需要遵循这几个等级:
trace、debug、info、warn、error、fatal - LogFactory为一个抽象类,使用工厂模式,可以创建一个实现了Log接口的日志记录器实例,而且该记录器实现是集成了JavaAPI和JAXP
【关键:LogFactory的实现是基于SAXParserFactory和DocumentBuilderFactory的,所以在使用的时候有可能还会用到Apache Xerces[一个可以解析XML的库]】 - LogSource类【Deprecated】:
该类是原版本的创建Log实例的类,现在已经被LogFactory替代了。当LogFactory创建某个Log实例的时候,应用程序可以通过调用方法makeNewLogInstance去实例化某个类或者针对该类的实现类进行配置工作。默认情况下,如果调用方法getInstance()将会使用下列算法:
[1]如果Log4J是配置好了的,那么LogFactory会创建一个org.apache.commons.logging.impl.Log4JLogger实例
[2]如果JDK是1.4或者以上的版本,LogFactory就会创建一个org.apache.commons.logging.impl.Jdk14Logger实例
[3]如过两个都没有满足,就返回一个org.apache.commons.logging.impl.NoOpLog实例
上边是默认的配置和默认的创建实例的行为,但是我们可以通过两种方法修改相关内容
[1]启动命令提示行,在进行java编译的时候设置自定义的org.apache.commons.logging.Log的实现类的名称
[2]在运行时调用LogSource.setLogImplementation() - LogConfigurationException类:
当使用LogFactory创建实现了Log类接口的实例的时候,如果创建失败就会抛出该异常 - AvalonLogger类:
该类有两种用途:
[1]该类的实例可以通过AvalonLogger(Logger)方法来进行构造,在这种情况下,该类在Logger外层进行了一层简单的封装,这种用法最大的用途在于使用一个属性设置器的时候。
[2]方法setDefaultLogger(org.apache.avalon.framework.logger.Logger)的属性调用来设置Avalon类的关联
这里插入Avalon框架的一段介绍:Apache的Avalon是一个包括核心框架、工具、组件和容器的面向组件编程(COP)的完整开发平台。通过使用关键设计模式,如反向控制模式(IoC)和分离考虑模(SoC),Avalon实现了传统OOP框架的一些优点: 1.没有执行锁 2.组件之间低耦合 3.管理组件生命周期
4.配置管理和易用的API 5.组件元数据框架和工具 6.服务相关的管理独立的、J2EE或Web环境的嵌入式容器 在COP方面,可重用的组件能够被组合到容器中,以提供应用程序模块。模块可以依次使用来创建你所需要的,从客户桌面应用程序,到FTP服务器,到Web服务,等等。Avalon提供各种基本组件和缺省的应用程序模块,帮助你快速的建立你自己的应用程序解决方案。 - Jdk13LumberjackLogger:实现了接口org.apache.commons.logging.Log,封装了Lumberjack实现部分,主要用于JDK 1.4之前实现Java的日志记录,Lumberjack项目是用来进行Java日志记录的老版本的日志API
- Jdk14Logger:实现了接口org.apache.commons.logging.Log,用来封装了上边我们讲到的JDK 1.4 Logging Framework
- Log4JLogger:实现接口org.apache.commons.logging.Log,用来封装了Log4j版本1.2里面的Logger实例,初始化该实例的配置的时候应该使用通常的初始化方式。
该类不能用于Log4j 1.3,主要原因在于:[1]1.2版本的Logger使用的是Priority参数而不是我们介绍的Level参数;[2]Level类是继承于Priority的,在1.3版本里面,需要修改相关优先级,但是不是继承于Priority的,所以不兼容1.3版本,具体原因是否如此我不太清楚。 - LogFactoryImpl类:LogFactory的子类,通过一定的算法动态选择应该使用哪种日志记录器,主要对底层的不同的日志实现类进行简单的封装
[1]使用工厂配置属性org.apache.commons.logging.Log用来标识使用的实现类
[2]使用org.apache.commons.logging.Log系统属性用来标识使用的实现类
[3]如果Log4J是配置好了的,那么LogFactory会创建一个org.apache.commons.logging.impl.Log4JLogger实例
[4]如果JDK是1.4或者以上的版本,LogFactory就会创建一个org.apache.commons.logging.impl.Jdk14Logger实例
[5]如过两个都没有满足,就返回一个org.apache.commons.logging.impl.SimpleLog实例
不仅仅如此,该类还有一个方法可以提供反向的关联,使用Log实现类的方法setLogFactory(),传入一个参数LogFactory,这种方法调用过后就可以修改实现类对应的Factory的关联项,在整个程序运行过程中,Factory将会记录下来所有创建过的Logger实例对象,当再次调用getInstance()方法的时候就直接从记录里面激活该实例。
【我仔细思考了以下,这个地方应该使用了Logger的“池化”技术,使用工厂虽然可以反复进行实例的构造,但是使用的是Logger的name作为标识,从设计上考虑,Logger的名字一般情况下都是某个类的全名,从整个系统级别讲,如果OO设计设计得不错的话,每一个类如果需要进行日志记录的话最好使用单个日志记录器,这样可以节省系统开销。】 - LogKitLogger类:实现了接口org.apache.commons.logging.Log,该类封装了avalon-logkit日志系统,仅仅将LogKit留给用户自己进行配置。
- NoOpLog类:该类将会抛出所有的相关异常信息,没有任何系统属性配置的支持,一般情况下不使用该类。
- SimpleLog类:简单实现了org.apache.commons.logging.Log接口,用来记录所有可用的日志信息,而且把所有定义好的Logger输出到System.err,下边的一些系统属性可以用来配置该Logger的一些属性:
[1]org.apache.commons.logging.simplelog.defaultlog——默认的SimpleLog的等级参数,必须是以下的值的集合(trace,debug,info,warn,error,fatal),如果没有设置默认为info
[2]org.apache.commons.logging.simplelog.log.xxxxx——定义某个名称为xxxxx实例的日志器的等级,同上值必须是一个Level的集合
[3]org.apache.commons.logging.simplelog.showlogname——如果为true在日志记录的时候需要输出name属性,如果false的话就不输出Logger的名称,默认为false
[4]org.apache.commons.logging.simplelog.showShortLogname——和上边参数一样,唯一的区别是该项是类名,而上边的参数是输出的类全名,还有不同的是默认值为true
[5]org.apache.commons.logging.simplelog.showdatetime——为true就输出时间,如果为false就不输出时间,默认是false
[6]org.apache.commons.logging.simplelog.dateTimeFormat——设置时间的格式,该格式应该是java.text.SimpleDateFormat可以解析的时间合法格式
这种配置需要检测类加载器在路径里面是否可以找到simplelog.properties的属性文件用来配置以上的选项,或者直接在java命令后边带上相关的参数 - ServletContextCleaner类和WeakHashtable类在此不做讲解,需要了解的可以去查询该类的API,而且我没有用到过这两个类,所以也没有去了解这两个类到底做了些什么,不好意思。
commons-logging.properties
#log4j.configuration=log4j.properties
WARN,stdout
org.susan.java.logging;
org.apache.commons.logging.Log;
org.apache.commons.logging.LogFactory;
LogTest {
main(String args[]){
.Java中的异常、断言、日志【草稿下,Log4j专题】的更多相关文章
- java中的异常体系?throw和throws的区别?
一.java中的异常体系 Thorwable类(表示可抛出)是所有异常和错误的超类,两个直接子类为Error和Exception,分别表示错误和异常.其中异常类Exception又分为运行时异常(Ru ...
- 【Java心得总结二】浅谈Java中的异常
作为一个面向对象编程的程序员对于 下面的一句一定非常熟悉: try { // 代码块 } catch(Exception e) { // 异常处理 } finally { // 清理工作 } 就是面向 ...
- Java中的异常-Throwable-Error-Exception-RuntimeExcetpion-throw-throws-try catch
今天在做一个将String转换为Integer的功能时,发现Integer.parseInte()会抛出异常NumberFormatException. 函数Integer.parseInt(Stri ...
- Java中的异常和处理详解
简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格:用函数返回值作为执行状态?. ...
- Java 中的异常
前段时间集合的整理真的是给我搞得心力交瘁啊,现在可以整理一些稍微简单一点的,搭配学习 ~ 突然想到一个问题,这些东西我之前就整理过,现在再次整理有什么区别嘛?我就自问自答一下,可能我再次整理会看到不一 ...
- Java 中的异常和处理详解
Java 中的异常和处理详解 原文出处: 代码钢琴家 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误 ...
- Java 中的异常和处理详解(转载)
原文出处: 代码钢琴家 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格:用函 ...
- Java中的异常和处理详解(转发:https://www.cnblogs.com/lulipro/p/7504267.html)
简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格:用函数返回值作为执行状态?. ...
- 夯实Java基础系列10:深入理解Java中的异常体系
目录 为什么要使用异常 异常基本定义 异常体系 初识异常 异常和错误 异常的处理方式 "不负责任"的throws 纠结的finally throw : JRE也使用的关键字 异常调 ...
- 深入探讨Java中的异常与错误处理
Java中的异常处理机制已经比较成熟,我们的Java程序到处充满了异常的可能,如果对这些异常不做预先的处理,那么将来程序崩溃就无从调试,很难找到异常所在的位置.本文将探讨一下Java中异常与错误的处理 ...
随机推荐
- Codeforces 1288D - Minimax Problem
题目大意: 给定n个序列,每个序列元素个数严格相等于m 你需要找到两个序列a[i]和a[j],使其每个对应位置的元素取大后得到b序列 b[k]=max(a[i][k],a[j][k]) 且让b序列中 ...
- tensroflow中如何计算特征图的输出及padding大小
根据tensorflow中的conv2d函数,我们先定义几个基本符号 1.输入矩阵 W×W,这里只考虑输入宽高相等的情况,如果不相等,推导方法一样,不多解释. 2.filter矩阵 F×F,卷积核 3 ...
- [NOI2014]魔法森林(LCT)
蒟蒻又发现自己还没写过LCT…… 首先显然按照权值a从小到大排序,维护b的最小生成树.然后直接扫,代价是加入b的最大值,然后动态加边,因为有边权,所以在lct中边应该理解为点.每次连接(u,v)时,若 ...
- 添加头文件的报错failed to emit precompiled header 的解决办法
在buildsetting中的以下两个路径中添加对应的设置,重现编译即可解决,stackoverflow地址:点击 Solution:1 I added $(inherited) non-recurs ...
- Python程序中的线程操作(线程池)-concurrent模块
目录 Python程序中的线程操作(线程池)-concurrent模块 一.Python标准模块--concurrent.futures 二.介绍 三.基本方法 四.ProcessPoolExecut ...
- JS 判断移动端与PC端
js判断移动端与pc端 这里介绍下使用device.js插件来判断移动端设备 地址:https://github.com/matthewhudson/device.js 示例: 1 2 3 4 5 ...
- Mac 终端实现快速定位命令 自动补全目录
基于macOS oh-my-zsh 切换终端主题 incr.zsh 实现快速定位命令 自动补全目录 效果预览 步骤 1.安装 oh-my-zsh sh -c "$(curl -fsSL ht ...
- 解决 Win7 远程桌面 已停止工作的问题
Windows 7远程桌面登录时崩溃, 错误提示如下: 问题签名: 问题事件名称: APPCRASH 应用程序名: mstsc.exe 应用程序版本: 6.1.7601.18540 应用程序时间戳: ...
- 添加新硬盘,扩展Centos7根分区
##背景介绍,系统安装时,分配的硬盘容量太小,根分区空间不够用,现添加一个新硬盘,通过以下步骤来扩展centos7根分区 [root@t201 ~]# df -h 文件系统 容量 已用 可用 已用% ...
- 在线好用的json转xml超级好用在线json与xml互相转换
在线好用的json转xml超级好用在线json与xml互相转换 拿走不谢:http://www.yzcopen.com/json/jsonxmlformat