java-异常/断言/日志/调试

一.异常
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值