3.异常与调试工具

1.java异常层次结构
Error和RuntimeException称为未检查异常,其他为已检查异常。
根Throwable
Error 系统内部错误,需要尽量避免
Exception
(1)RuntimeException 能够避免的错误,如果有错编译器还是能够通过编译,并且能够被捕获。
举例:
println(2/0); 虽然编译器能通过编译,但是会自动报arithmeticException。
(2)非RuntimeException 一定要处理这个异常,不然编译器不能通过编译。
举例:
void main(...)
{ FileInputStream s=new FileInputStream();...} 不能通过编译,需要通过try catch捕获或者throws即抛出。
2.在函数声明处throws的异常都是已检查异常,并且需要声明所有可能抛出的所有异常。
3.抛出异常方法:
void f() throws SomeException
{
...
throw new SomeException();
...
}
4.异常的方法
Throwable t=new Throwable(String); //可以更加详细的说明抛出的异常。
Throwable t=new Throwable();
t.getMessage(); //获得t的信息
5.应该捕获所有知道怎么处理的异常,而把不知道怎么处理的异常抛出去让异常处理器处理。
6.finally语句由于不管是否发生异常都会执行的特性,用于释放资源,因为如果把释放资源的代码放在try中,在发生异常的情况下会不执行这些代码。

int f(int n)
{
try{
return 2;
}finally{
if(n==2) return 0;
}
}
人们可能认为将一直会返回2,但是当f(2)时,在finally中的返回0将覆盖2.
7.堆栈跟踪:
(1)t.printStackTrace();
(2)t.getStackTrace();返回StackTraceElement[],把每个元素调用toString即可。
8.早抛出,晚捕获即不需要强求把异常全部自己处理。
9.日志Log
(1)Logger.global.info("..")已经过时,不能使用,取而代之的是Logger.getLogger(Logger.GLOAL_LOGGER_NAME).info("...")
这是一个全局的日志记录,我们可以为自己创建一个日志记录。
Logger log=Logger.getLogger("com.xiazdong"); //参数最好是包名。
日志记录器有7级:SEVERE\WARNING\INFO\ CONFIG\FINE\FINER\FINEST 每个级别都有记录的方法如log.warning("..")|log.info("..")|log.config("..")|log.fine("...");
默认只能显示前三个级别的记录,当然可以自己设置记录的日志的级别,log.setLevel(Level.FINE); 设置记录前4个级别的日志。
Logger.setLevel(Level.ALL)记录所有级别的日志
我们在jre文件夹中有一个logging.properties文件,配置我们的日志,比如默认的记录日志的级别。
(2)日志处理器Handler
我们可以看到,当我们调用log.info()的时候把信息都显示在console中了,有一个处理器叫做ConsoleHandler,默认日志记录都是传输到这个处理器中的。
默认情况下,日志记录器会把记录发送到自己安装的处理器和父处理器(Console)中,而我们自己安装的consoleHandler都是console的子类,所以如果我们安装了一个自己的ConsoleHandler,调用log.info()时会在Console中显示两次重复的内容。
可以通过log.setParentHandlers(false);消除重复。(我认为注册两个consoleHandler纯属无聊。。)
还有两个处理器,FileHandler和SocketHandler,最常用的当然是FileHandler,能够把日志记录重定向到指定的路径(在配置文件中已经把日志的文件名格式确定了)。
日志记录默认是xml形式记录的。记录时间,日志记录器名,记录的级别等。
FileHandler默认的存放日志的路径是系统属性user.home,每个电脑的属性都是不同的,我们可以通过System.getProperty("user.home");获得路径。
(3)函数进入和退出时可以调用logger.entering("class","method",param); logger.exiting("class","method");
(4)类似printf的记录方法,logger.log(Level.FINE,"...{0}...{1}...",param0,param1);
(5)如果不想使用已知的处理器,可以通过继承StreamHandler创建自定义的处理器。可以重新实现
isLoggable(LogRecord record); //过滤器,检查是否是符合的record
publish(LogRecord record); //处理器是否把记录写到输出流中
setOutputStream(...) ; //设定输出流 输出流行为可以自己定义,可以以某种特定的格式输出到某地。
publish范例:可以马上在输出流中看到记录
{
super.publish(record);
flush();
}
(6)swing程序运行时,ctrl+shift+F1会在console中显示组件的层次。
(7)在命令行中直接输入jconsole,弹出一个java监视器,监视虚拟机的性能。
(8)System.setOut(PrintStream s); //将System.out重定向到s
(9)类似于前面的自定义处理器,我们可以把console的输出重定向到自定义的地方,比如TextArea。
创建PrintStream p=new PrintStream(new OutputStream()
{
public void write(byte[]b,int off,int len)
{
...
}
public void write(byte[]b){}
}
);
System.setOut(p); 即可把out重定向到p输出流
(10)自动测试类java.awt.robot:这是一个自动测试的类,可以模拟键盘事件和鼠标事件传递给组件,这样就可以不用我们自己测试。
如果要模拟,需要对于我们整个显示设备有所了解。
GraphicsEncironment environment=GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice screen=environment.getDefaultDevice();
Robot robot=new Robot(screen); //这样就把robot创建好了


robot.keyPressed(KeyEvent.VK_A)
robot.keyReleased(KeyEvent.VK_A) 就可以模拟按下鼠标和释放鼠标的动作。

robot.mouseMove(x,y);
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK); 模拟鼠标移动,按下,放开的动作。


robot.delay(s);可以让robot在动作间停顿特定时间。
robot.createScreenCapture(new Rectangle()); 获得一张快照,返回BufferedImage。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值