异常与调试

在Java中,异常对象都是派生于Throwable类的一个实例。

派生于RuntimeException类或者Error类的所有异常称为【未检查异常】,其他的异常称为【已检查异常】。

Error类描述Java运行时系统的内部错误和资源耗尽错误;

派生于RuntimeException的异常包括:错误的类型转换;数组越界访问;访问空指针。

不是派生于RuntimeException的异常包括:试图在文件尾部后面读取数据;试图打开一个格式错误的URL;试图根据给定的字符串查找Class对象,而这个字符串表示的类不存在。

在自己编写方法时,需要记住遇到下面4中情况时才会抛出异常:

1)调用一个抛出已检查异常的方法;

2)在程序运行过程中发现错误,并且利用throw语句抛出一个已检查异常;

3)程序出现错误;

4)Java虚拟机和运行时库出现的内部异常。

如果一个方法有可能抛出多个已检查异常,就必须在方法的首部列出所有的异常类。每个异常类之间用逗号隔开。

不需要声明从Error继承的那些异常,任何程序代码都有抛出这类异常的能力,而我们对他们没有任何控制能力。

同样,也不应该声明从RuntimeException继承的那些未检查异常。这些运行时错误完全在我们的控制之下,应该多花时间修正程序的错误,而不是说明这种错误发生的可能性。

如果在子类中覆盖了超类的一个方法,那么子类方法中声明的已检查异常不能超过超类方法中声明的异常范围。特别是,如果超类没有抛出任何已检查异常,那么,子类也不能抛出任何已检查异常。

假设一个名为readData的方法正在读取一个首部具有下列信息的文件:Content-length:1024,然而,读到733个字符之后文件就结束了,此时,我们认为这是一种非正常的情况,希望抛出一个异常。

查看Java API文档后发现:EOFException异常的描述是:在输入过程中,遇到一个未预期的EOF后的信号。这正是我们要抛出的异常。

String readData(Scanner in) throws EOFException
{
    ...
    while(...)
    {
        if(!in.hasNext()) //EOF encountered
        {
            if(n<len)
                throw new EOFException();
        }
        ...
    }
    return s;
}

综上,抛出一个已经存在的异常类是很容易的:

1)找到一个合适的异常类;

2)创建这个类的一个对象;

3)将对象抛出。

有时候,找不到合适的已存在异常类,就需要我们自己创建异常类了。我们要做的是定义一个派生于Exception的类,或者派生于Exception子类的类。习惯上,定义的类应该包括两个构造器:一个是默认的构造器,一个是带有详细描述信息的构造器。

class FileFormatException extends IOException
{
    public  FileFormatException(){}
    public  FileFormatException(String gripe)
    {
        super(gripe);
    }
}
//现在,就可以抛出自己定义的异常类型了
String readData(BufferedReader in) throws FileFormatException
{
    ...
    while(...)
    {
        if(ch == -1) //EOF encountered
        {
            if(n < len)
            throw new FileFormatException();
        }
        ...
    }
    return s;
}
时间: 2024-10-23 06:31:09

异常与调试的相关文章

主动抛异常获取调试堆栈信息

android开发中常见的调试方法有: 下断点(break point)调试跟踪: 此方法局限性最大,要求程序是可中断,且非系统应用等. 打印日志(systemout.log都是此类): 此方法应用最广泛,也常在应用整个流程的关键位置或方法上记录,方便bug出现时的状态及流程获取.但是日志也仅局限于单个代码位置的状态记录,难以获取更广的上下文信息.本文要补充讨论的内容就是要解决这个问题: 通过获取命令调用的堆栈,来获取更全面的调试信息.至于如何获取这边提供主动抛异常的方法: try { thro

python -- 程序异常与调试(程序调试)

一.程序调试 A.使用assert语句检测程序代码中的错误. assert 表达式[, 参数] 如果表达式为True,则继续往下运行:如果为False,则抛出一个AssertionError异常,并且输出asser语句的参数作为错误信息字符串. B.使用日志模块logging打印跟踪信息,调试程序. import logging logging.basicConfig(level=logging.DEBUG) logging.info() C.使用PyCharm的调试器调试序(Debug). #

Python基础总结之异常、调试代码第十二天开始(新手可相互督促)

年薪20万的梦想,加油! 我们在写代码的时候,控制台经常会报错,因为某种错误,导致我们的程序停止,且不再运行下面的代码. 我们看一个错误的代码示例: def add_1(): #没有参数 print('我出错了') #不会被执行 def add_2(): #函数二调用函数一 print('第二个函数调用函数一,并给他一个参数') add_1(4) #函数一没有参数,所以有会报异常,并终止,不会执行函数一里面的代码 def add_3(): #函数三调用函数二 add_2() d = add_3(

Delphi应用程序的调试(十)调试器选项(在IDE中不要使用异常)

可在两个级别上设置调试选项:工程级和环境级.在前面的讲解中讲解了工程级调试选项,通过主菜单[Project | Options…]打开如下对话框: 可在Debugger Options对话框中设置全局级调试选项.从主菜单[Tools | Debugger Options]菜单项调出Debugger Options对话框. 在Debugger Options对话框的底部有一个标记为Integrated debugging的复选框,它控制是否使用IDE调试器调试程序.如果选中Integrated d

[Win32]一个调试器的实现(三)异常

[Win32]一个调试器的实现(三)异常 作者:Zplutor 出处:http://www.cnblogs.com/zplutor/ 本文版权归作者和博客园共有,欢迎转载.但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 这回接着处理上一篇文章留下的问题:如何处理EXCEPTION_DEBUG_EVENT这类调试事件.这类调试事件是调试器与被调试进程进行交互的最主要手段,在后面的文章中你会看到调试器如何使用它完成断点.单步执行等操作.所以,关于这类调

Windows调试2.异常产生详细流程

程序设置了int3断点函数 CPU获取后,根据IDT表中的int3的处理函数 主要工作大概是 填充 _KTRAP_FRAME 结构体, 保存的是异常发生时的寄存器环境, 因为在异常处理完毕之后,需要返回产生异常的地方继续执行 然后把异常给CommonDispatchException //总结如下几个顺序 __asm int 3; ? -> IDT[3]: _KiTrap03 (填充一个陷阱帧,用于继续执行代码) ? -> CommonDisapathException(异常地址, 异常的类型

第20章 异常和状态管理20.7-20.13

20.7用可靠性换取开发效率 面向对象编程,编译器功能,CLR功能以及庞大的类库——使.Net Framework成为一个颇具吸引力的开发平台.但所有的这些东西,都会在你的代码中引入你没有什么控制权的“错误点”,如果 OutOfMemoryExcepton等.程序开发不可能对这些异常进行一一捕捉,让应用程序变得绝对健壮.意料意外的异常往往造成程序状态的破坏,为 了缓解对状态的破坏,可以做下面几件事: ●执行catch或finally块时,CLR不允许终止线程,所以可以向下面这样写是Transfe

Windows 下常见的反调试方法

稍稍总结一下在Crack或Rervese中比较常见的一些反调试方法,实现起来也比较简单,之后有写的Demo源码参考,没有太大的难度. ①最简单也是最基础的,Windows提供的API接口:IsDebuggerPresent(),这API实际上就是访问PEB的BeingDebugged标志来判断是否处于调试状态. if (IsDebuggerPresent()) //API接口 { AfxMessageBox(L"检测到调试器"); } else { AfxMessageBox(L&qu

Android Studio代码调试大全

http://blog.csdn.net/dd864140130/article/details/51560664 Android Studio目前已经成为开发android的主要工具,用熟了可谓相当顺手.作为开发者,调试并发现bug,进而解决,可是我们的看家本领.正所谓,工欲善其事必先利其器,和其他开发工具一样,如Eclipse.Idea,Android Studio也为我们提供了强大的调试技巧,今天我们就来看看Android Studio中有关调试的技巧. 首先,来看看Android stu