发布于2021-05-29 21:44 阅读(1329) 评论(0) 点赞(27) 收藏(4)
最近发现自己调bug的能力不足,显然多跑代码是最有效的提高办法,但在这之前有必要储备一些理论常识。
如果想要深入了解这部分的内容,建议阅读一下相应的源码和api。
程序中常见的错误:
派生于RuntimeException的异常包含下面几种情况∶
如果出现了RuntimeException,就一定是你的问题。
不是派生于 RuntimeException 的异常包括∶
未检查异常: 派生于Error类、RuntimeException类的所有异常。
已检查异常: 其他异常,派生于IOException类的异常。编译器将核查是否为所有的已检查异常提供了异常处理器。
如果遇到了无法处理的情况,那么 Java 的方法可以抛出一个异常。这个道理很简单∶一个方法不仅需要告诉编译器将要返回什么值,还要告诉编译器有可能发生什么错误。例如,一段读取文件的代码知道有可能读取的文件不存在,或者内容为空,因此,试图处理文件信息的代码就需要通知编译器可能会抛出 IOException类的异常。
public demo(String name) throws FileNotFoundException,xxException{
}
//写法一
throw new EOFException();
//写法二
EOFException e=new EOFException();
throw e;
一旦方法抛出了异常,这个方法就不可能返回到调用者。也就是说,不必为返回的默认值或错误代码担忧。
习惯上,定义的类应该包含两个构造器,一个是默认的构造器;另一个是带有详细描述信息的构造器(超类 Throwable 的 toString 方法将会打印出这些详细信息,这在调试中非常有用)。
//自定义异常
class FileFormatException extends IOException
{
public FileFormatException(){}
public FileFormatException(String gripe){
super(gripe);
}
}
//抛出异常
public String demo(int in)throws FileFormatException{
if(in==1) throw new FileFormatException();
return "return";
}
//捕获异常
Demo demo=new Demo();
try{
demo.demo(1);
}catch(FileFormatException e){
System.out.println("异常出现");
e.printStackTrace();
}
运行结果:
捕获单个异常:
Demo demo=new Demo();
try{
demo.demo(1);
}
catch(FileFormatException e){
System.out.println("异常出现");
e.printStackTrace();
}
捕获多个异常:
注意,这只是展示语法规则,实际上不存在这几个异常类:
Demo demo=new Demo();
try{
demo.demo(1);
}
catch(Exceptio1 e1|Exception2 e2){
System.out.println("异常出现");
}
catch(Exception3 e){
}
catch(Exception4 e){
}
可以在catch字句中再次抛出异常。
finally子句:
try{
}catch(){
}finally{
System.out.println("finally");
}
子句执行顺序:
try{
//1
...
//2
}catch(){
//3
...
//4
}finally{
//5
System.out.println("finally");
}
//6
执行顺序是:1、2、5、6
执行顺序是:1、3、4、5、6
执行顺序是:1、3、5、6
执行顺序是:1、5
注意:finally中也有可能会再次抛出异常
//写法一
assert 条件;
//写法二
assert 条件:表达式;
这两种形式都会对条件进行检测,如果结果为 false,则抛出一个 AssertionError 异常。在第二种形式中,表达式将被传入 AssertionError 的构造器,并转换成一个消息字符串。
关于日志这部分只做简单介绍,因为之后会学习专门的日志框架,原生的并不是那么好用。
Logger.getGlobal()是一个默认日志记录器
public static void main(String[] args) {
Logger.getGlobal().info("默认日志记录器");
}
Logger.getGlobal().setLevel(Level.OFF);//关闭日志记录器
Logger.getGlobal().setLevel(Level.INFO);//激活全局日志记录器
日志级别
在默认情况下,只记录前三个级别,设置级别:
logger.setLevel(Level.FINE);//设置级别
logger.setLevel(Level.OFF);//关闭所有级别的记录
logger.setLevel(Level.ALL);//开启所有级别的记录
默认的日志配置记录了INFO 或更高级别的所有记录,因此,应该使用 CONFIG、 FINE、FINER和FINEST级别来记录那些有助于诊断,但对于程序员又没有太大意义的调试信息。
在企业级程序中,最好不要将所有的日志都记录到一个全局日志记录器中,而是自定义日志记录器。
private static final Logger myLogger=Logger.getLogger("com.wang.mylog");
父子记录器之间将共享某些属性,比如,如果对com.wang这个父记录器设置了日志级别,子记录器也会继承这个级别。
还有很多可以学习的调试技巧,这里只是列举了最简单的几种。
原文链接:https://blog.csdn.net/Tracycoder/article/details/117041278
作者:小光头吃饭不用愁
链接:http://www.javaheidong.com/blog/article/207536/a712d0404eb417ffb1f8/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!