java(异常和日志)

java异常看这篇就够了http://www.cnblogs.com/lulipro/p/7504267.html

1.类路径

所谓的类路径就是指程序运行时jvm要加载的类的.class文件所在地方

注意两种情况:当我们是在一个完整项目下写代码的时候,类路径一般IDE都会帮我们设置好,一般都是在xx/classes或者xx/lib这样的地方,项目打包的时候,这些会被打包进去。还有一种情况,就是我们可能只是单纯的使用简单的编辑器想验证一下某个简单的想法的时候,这时候我们没有用IDE,简单的编写个java文件,然后javac,java命令运行一下就能执行,一般这样的都是实现简单的功能,需要用到的类都是java语言本身的类,所以我们在使用import语句导入所需的类的时候,运行的时候,当看到import的语句,就去环境变量classpath指定的路径下找需要的.class文件,如果没找到就会报错



2.JAR(java archive)java归档文件

使用了Zip压缩格式,里面可以放各种资源文件,每个jar文件都有个清单文件(manifest),名字为MAINFEST.MF,用来对jar文件的内容和来源进行说明,放在一个META-INF的目录里,清单文件每个条目用空行隔开,清单文件必须以换行符结尾

jdk的java内置类的.class文件在一个jre/lib/rt.jar的文件里

3.可运行的jar

在清单文件中指定Main-Class

4.java    javaw    javaws

java.exe用于启动window console  控制台程序

javaw.exe用于启动 GUI程序

javaws.exe用于web程序。

jvm.dll就是java虚拟机规范在windows平台上的一种实现

5.资源文件

类加载器可以在类路径下找到需要加载的.class文件,资源文件怎么办呢,Class有两个方法

URL getResource(String name)

InputStream getResourceAsStream(String name),没找到则返回null,不会抛异常或发生I/O错误

资源的路径默认都是相对于需要加载的类的.class文件所在的目录

6.密封

想要让一个包不让别的类放进来,可以使用密封机制。使用密封机制,需要把这个包打包成jar包,并在jar包的清单文件中加入Sealed:true,可以全局设置,也可以单独对每个条目

7.属性映射Properties

Properties类:存储键值对

Properties settings = new Properties()

也可以在构造的时候提供一个二级表存放默认值,如Properties settings = new Properties(default)

settings.put("name","luckee")//添加属性

settings.put("address","china")//添加属性

FileOutputStream out = new FileOutputStream("program.properties")

settings.store(out,"this is header")//写进文件,第二个参数存储文件的第一行标题

---------------------------------分割线--------------------------------------

FileInputStream in = new FileInputStream("program.properties")

Properties settings = new Properties()

settings.load(in);//读取文件

String name = settings.getProperty("name")//获取属性

也可以指定默认值String name = settings.getProperty("name","jack"),如果没有name属性,则取默认值

String address = settings.getProperty("address")

8.java.lang.System

Properties getProperties()//获取全部系统属性

String getProperty(String key)//获取给定键名的系统属性

user.home属性是系统当前用户的主目录

9.首选项Preference

中心知识库,以树的形式(类似于包结构),为每个节点维护(属性,设置等数据),建议跟包结构一致,两种根节点,系统根节点和当前用户根节点,下面是Preference的API

Preference userRoot()

Preference systemRoot()

preference node(String path)

Preference userNodeForPackage(Class c1)

Preference systemNodeForPackage(Class c1)

String[] keys()

String get(String key,String default)

int getInt(String key,int default)//其他类型的类似

String put(String key,String value)

int putInt(String key,int value)//其他类型的类似

exportSubtree(OutputStream out)

exportNode(OutputStream out)

importPreferences(InputStream in)

10.Throwable是一个类,不是接口

Throwable派生出Error(系统的内部错误和资源耗尽错误,不应该抛出)和Exception,Exception派生出RuntimeException(程序本身的错误,如错误的类型转换,数组越界,空指针等)和其他的非程序本身的错误引起的异常(如IOEXception,如试图打开一个不存在的文件,根据名称加载一个不存在的类等),Error和RuntimeException派生出来的称为未检查(unchecked)异常,其他的派生出来的称作已检查(checked)异常,编译器将检查是否为所有的checked异常提供了异常处理器


在处理异常的时候,可以选择抛出,也可以选择捕获。对于知道如何处理的异常就捕获,不知道如何处理的就向上抛出(给调用者)。对于选择抛出的,必须在方法声明的时候用throws进行声明,声明多个异常用逗号分隔。调用者在调用这种方法的时候,必须进行处理,或者选择继续向上传递(抛出)。对于子类覆盖父类方法的时候,对于已检查异常,如果父类方法使用了throws,那么子类throws的异常通用性不能大于父类(即可以是同一异常,子类异常或者不抛出异常)

通常我们的思路可以是,在方法定义时声明可能会抛出异常,方法内并不捕获异常,而让方法的调用者自己去处理异常,如果一个方法内抛出了一个异常(new一个然后抛出),那方法就会停止运行,将异常抛给调用者,不用去担心返回值了。如果是捕获了一个异常,那就停止执行try代码块里面的代码,转去执行catch块和finally块的代码,然后接着执行try代码块外面的代码,如果catch里面又抛出了异常,那就直接将异常抛给方法的调用者,try代码块外面的代码也不执行了,方法结束

catch代码块中也是可以继续抛出异常的,通常这样做可以改变异常的类型,可以将捕获的异常进行包装,并将其设置为包装后的异常的原因,这样就不会丢失原始异常的信息

当捕获多个异常的时候,应该将具体的异常放在前面,通用的放在后面(如子类放在前,父类放在后)

如果有异常出现,没有捕获,那方法将停止运行

finally块中的return会覆盖try块中的return,如果finally块中也抛出异常,那么会覆盖原始的异常,原始的异常会丢失(卷一p484~485)

public static void main(String[] args) {

System.out.println(f());//4

}

public static int f(){

try{return 2;}

finally{return 4;}

}

catch (Exception e)中的e为final,不可以再进行赋值

带资源的try(try-with-resources)

try(declare resource here……){……},try语句块结束时,资源会自动关闭(卷一p486~487)

11.堆栈追踪stackTrace(卷一p487)Thread.dumpStack()(卷一p514)

12.异常机制使用的6个技巧(原则,卷一p490)

不要用异常代替简单错误检查,捕获异常所花的时间更多

不要分过细化异常,这样会使代码更多。应该在一段代码后统一使用catch语句

异常要分层次,用最适合的异常类型,不要笼统使用Throwable,Exception,RuntimeException

不要压制异常

检错错误时,要更苛刻。比如,对于无效的参数宁可抛出异常,也不要返回一个异常的值

不要羞于传递异常。有时候把异常交给调用者去处理

13.断言机制,关键字assert

测试代码不应该存在于最终的代码中,断言机制就是解决这个问题(断言默认关闭)

不管是测试代码还是断言机制,都是在开发和测试阶段使用的

14.日志(Logger)

日志分为七个级别,从高到低为以下

SERVER

WARNING

INFO

CONFIG

FINE

FINER

FINEST

默认级别是INFO(即记录INFO及以上的日志)

全局日志记录器Logger.global

Logger.getGlobal()//获取全局记录器

Logger.getLogger("xxx.xxx.xxx")//根据包名来获得记录器,子记录器会继承父记录器的级别

logger.setLevel(Level.CONFIG)//设置记录器级别为CONFIG,Level.ALL开启所有级别的记录,Level.OFF关闭所有级别的记录

logger.info(message)//以info级别记录message

logger.warning(message)//以warning级别记录message

logger.log(Level.info,message)//以info级别记录message

默认的日志配置文件为jre/lib/logging.properties

关于日志(java.util.logging),有4个器:记录器,处理器,过滤器,格式化器


日志工具log4j

单元测试Junit

压力测试Jmeter

jdk自带性能分析工具jconsole,jmap(将堆中的对象转存为一个文件),jhat(开启一个http服务,使得可以通过浏览器来进行查看转存到的堆文件)

要观察类的加载过程,可以启动虚拟机的时候加上-verbose选项

javac -Xlint告诉编译器对一些普片出现的代码问题进行检查

如javac -Xlint:fallthrough当switch缺少break语句的时候编译器会给出报告

java -X

注意-1

运行时异常是RuntimeException类及其子类的异常,是非受检异常,如NullPointerException、IndexOutOfBoundsException等。由于这类异常要么是系统异常,无法处理,如网络问题;要么是程序逻辑错误,如空指针异常;JVM必须停止运行以改正这种错误,所以运行时异常可以不进行处理(当然也可以处理,捕获或向上抛出),而由JVM自行处理。Java Runtime会自动catch到程序throw的RuntimeException,然后停止线程,打印异常。

非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类,是受检异常。非运行时异常必须进行处理(捕获或向上抛出),如果不处理,程序将出现编译错误。一般情况下,API中写了throws的Exception都不是RuntimeException

unchecked异常


运行时异常

checked异常


已检查异常

注意-2

try{

    ......//1,可能抛出异常的语句

    ......//2,异常后面的语句

} catch(Exception e) {

    ......//3,处理异常语句

}

finally{

......//4,finally语句

}

......//5,try块后的语句

如果没有异常发生,将执行1,2,4,5

如果异常发生被捕捉了只是单纯处理并未往上抛出,执行1,3,4,5

如果异常发生被捕捉了并向上抛出,则执行1,3,4

也就是说发生了异常,捕获并处理了的话,方法会继续运行;如果没有捕获或者捕获了但又重新抛出(throw)了异常,方法则会停止运行

如果想要在处理完异常后,接着执行try语句块中抛出异常位置后面的代码,可以将try语句放入一个循环中(https://blog.csdn.net/yangyong0717/article/details/78493074)


示例代码


结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,642评论 18 139
  • 废话不多说,自己进入今天的主题 1、面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:...
    传奇内服号阅读 2,344评论 1 31
  • 第一天 你早早起来就去公司 一直工作到晚上 把手头上的遗留工作都完成 然后去上司办公室递上辞呈 走回了家 第二天 ...
    年轻人真神奇阅读 143评论 0 2
  • 以往这个点 我绝对还守在电视机前 等着最后一个节目表演完 哪怕眼睛一直没离开过手机 现在呢 怎么说 突如其来的不开...
    23seagull阅读 365评论 0 0
  • 随着社会的迅速发展,人们的生活条件也越来越好,但是临床中我们发现很多孩子都出现了营养过剩,提前发育的情况。 今天麦...
    麦子育儿说阅读 932评论 0 0