一.异常
1.异常层次结构图
Throwable--
----Error
----Exception
----RunTimeException
----非运行时异常
2.创建异常类
public class CarWrongException extends Exception{
public CarWrongException(){
}
public CarWrongException(String msg) {
super(msg) ;
}
}
public class Car {
public static final int OK = 1 ;
public static final int Worker = 2 ;
public int run(boolean isTrue) throws CarWrongException{
if (true) {
return 1 ;
}
else {
throw new CarWrongException("车子不能不动的") ;
}
//return 1 ;
}
}
3.捕捉异常
(1).try{}catch(){异常处理}
(2).try{}catch(){}finally{跳出}
肯定会执行,资源释放
补充:finalize垃圾回收机制,自动回收
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
super.finalize();
}
(3).分析堆栈跟踪元素
Throwable t=new Throwable();
t.printStackTrace();
t.getStackTrace返回一个堆栈跟踪的数组
public class Throwable_Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a=10;
int b=0;
try {
double c=a/b;
} catch (Exception e) {
// TODO: handle exception
e.getMessage();
e.getStackTrace();
e.printStackTrace();
System.err.println("输入有错");
}
System.out.println("你好,谢谢使用");
}
}
4.抛出异常
throw(抛出异常)+异常对象/throws(声明异常)+异常类
public static void main(String[] args) throws NullPointerException{}
throw new NullPointerException();
二.断言
断言机制允许在测试期间向代码中插入一些检查语句。当代码发布时,这些插入的检测语句将会被自动地移走
java语言引入关键字assert。这个关键字有两种形式:
assert 条件;
assert 条件:表达式;
这两种形式都会对条件进行检测,如果结果为false,则抛出一个AssertionError异常。
在第二种形式中,表达式将被传入AssertionError的构造器,并转换成一个消息字符串。
三.记录日志
出现的问题:在我们调试的时候, 通过喜欢 插入 System.out.println 语句来辅助我们调试, 当出现新的问题,又要插入 该语句进行调试。
解决方法:记录日志API 就是为了解决这个问题而设计的。
下面是记录日志 API的优点(Priority):
P1)可以很容易地取消全部日志记录, 或者仅仅取消某个级别的日志, 而且打开和关闭这个操作也很容易;
P2)可以很简单地禁止日志记录的输出, 因此,将这些日志代码留在程序中的开销很小;
P3)日志记录可以被定向到不同的处理器, 用于在控制台中显示, 用于存储在文件中等;
P4)日志记录器和处理器都可以对记录进行过滤。 过滤器可以根据过滤实现器制定的标准丢弃那些无用的记录项;
P5)日志记录可以采用不同的方式格式化,例如, 纯文本或 xml;
P6)应用程序可以使用 多个 日志记录器, 他们使用类似包名的这种具有层次结构的名字, 如, com.a.b.c;
P7)在默认情况下, 日志系统的配置由配置文件控制。 如果需要的话, 应用程序可以替换这个配置;
1.基本日志
日志系统:有一个名为Logger.global的默认日志记录器,使用info方法记录信息:
注意:自动包含了时间,调用的类名和方法名。
public static void main(String[] args) {
// TODO Auto-generated method stub
Logger.getGlobal().info("file->Open menu item selected");
Logger.getGlobal().setLevel(Level.OFF);//激活全局日志记录器
}
}
结果:
八月 08, 2017 3:03:53 下午 day10.Dairy_Test main
信息: file->Open menu item selected
2.高级日志
在一个专业的应用程序中, 不要将所有的日志都记录到 一个全局日志记录器中, 而是可以自定义日志记录器;
调用 getLogger方法可以创建或 检索记录器
private static final Logger myLogger = Logger.getLogger("com.mycompany.myapp");
与包名类似, 日志记录器名也具有层次结构,且层次性更强
对于包来说, 一个包的名字与其父包的名字间没有语义关系, 但是日志记录器的父与子间将共享某些属性;
如果对 com.mycompany 日志记录器设置了 日志级别, 它的子记录器也会继承这个级别, 通常有7个日志记录器级别(Level):
L1) SEVERE
L2) WARNING
L3) INFO
L4) CONFIG
L5) FINE
L6) FINER
L7) FINEST
默认情况下, 只记录前3个级别, 也可以设置其他级别;
logger.setLevel(Level.FINE);
使用 Level.ALL 开启所有级别的记录, 使用 Level.OFF 关闭所有级别的记录;
对于所有的级别有下面几种记录方法(Methods):
M1) logger.warning(msg);
M2) logger.fine(msg);
M3)使用log 方法指定级别: logger.log(Lebel.FINE, msg);
默认的日志配置记录了 INFO 或更高级别的所有记录, 因此,应该使用 CONFIG、FINE, FINER, FINEST 级别来记录那些有助于诊断, 但对于程序员有没有太大意义的调试信息;
如果将记录设计为INFO 或更低, 则需要修改日志处理器的配置, 默认的日志处理器不会处理低于 INFO 级别的信息;
默认的日志记录将显示包含日志调用的类名和方法名, 如同堆栈所显示的那样。 但是, 如果虚拟机对执行过程进行了优化, 就得不到准确的调用信息。 此时, 可以调用 logp 方法获得调用类和方法的确切位置:
void logp(level l , String className, String methodName, String msg)
有一些跟踪执行流的方法:
void entering(String className, String methodName)
void entering(String className, String methodName, Object param)
void entering(String className, String methodName, Object[] params)
void entering(String className, String methodName)
void entering(String className, String methodName, Object result)
练习
int read(Strinf file, String pattern)
{
logger.entering("com.mycompany.mylib.Reader", "read", new Object[] {file, pattern});
......
logger.exiting("com.mycompany.mylib.Reader", "read", count);
return count;
}
调用throwing 可以记录一条 FINER 级别的记录和一条以 THROW 开始的信息;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class LogTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(b(2));
}
public static int b(int x)
{
try{
throw new IOException();
}catch (IOException e) {
// TODO: handle exception
Logger.getLogger("day10.LogTest").log(Level.WARNING, "method b occurs exception",e);
}
return x*x;
}
}
显示的结果:
八月 08, 2017 4:52:34 下午 day10.LogTest b
警告: method b occurs exception
java.io.IOException
at day10.LogTest.b(LogTest.java:16)
at day10.LogTest.main(LogTest.java:11)
4
测试2
package day10;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class LogTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(b(2));
}
public static int b(int x)
{
try{
throw new IOException();
}catch (IOException e) {
// TODO: handle exception
//Logger.getLogger("day10.LogTest").log(Level.WARNING, "method b occurs exception",e);
Logger.getLogger("day10.LogTest").log(Level.WARNING, "method b occurs exception","");
}
return x*x;
}
}
结果:
八月 08, 2017 4:54:22 下午 day10.LogTest b
警告: method b occurs exception
4