Java学习之异常处理

Java提供了在你程序中处理某些特定类型条件的方法。

异常是一个对象,他在执行期间发出出现非常时间的信号。

绝大多数短小的程序中需要极少的异常处理,没有的话就不需要,并且它所使用的异常处理通常不容易在程序中看到。

Exception(异常)是一个对象。

像下面语句:
throw new Exception(“出现异常”);

并不仅仅指定应该采取和遗忘某个动作,它创建一个包含一条消息的对象,在这个示例中,消息为“出现异常”。

要明白这一点,请注意前面的语句等价于下面的语句:
Exception exception=new Exception(“出现异常”);

这些语句中的第一条语句调用类Exception的构造器,创建一个类Exception的对象。

第二条语句抛出这个异常对象,这个对象和它的消息可为catch语句块所用,因此,抛出异常的效果比将控制权转给catch语句块的第一条语句包含了更多的内容。

抛出异常

Throw 语句抛出异常

语句

Throw new 异常的类名或者名称(“内容”);

Throw语句通常嵌入在if语句或if-else语句中,try块能够包含任意多个明确的抛出语句或任意多个可以抛出异常的方法调用。

示例

Throw new Exception(“出现异常”);

处理异常

一起使用的try和catch语句是处理异常的基本机制

Try{

Code...

Code...

Code...

}catch(异常类型 参数){

使用方法说明异常的原因

}

结束异常

如果Try块中抛出异常,那么try块中的剩余语句被忽略,执行转移到与所抛出异常所匹配的第一个catch语句块中执行,在该catch语句块执行完毕后,最后一个catch语句块后面的代码被执行。

如果在try块中没有抛出异常,那么在该块的语句执行完毕后,程序继续执行最后一个catch语句块后面的代码,换句话讲就是,如果没有抛出异常,那么catch语句块被忽略。

每一个try块 允许抛出多个异常,但每一个catch语句块仅仅能够处理一种类型异常。

参数是用作表示被抛出异常的占位符的一个标识符,当 异常类型 的异常在前面的try块中抛出时,该异常被插入为参数,参数的常用是e,但是你也可以使用任何合法的标识符。

方法

每一个异常对象都有一个包含了某个消息的String实例变量,它通常标识异常发生的原因 ,例如,如果异常由下述语句抛出(argument 参数)

Throw new Exception(String argument);

那么这个String实例变量的值为String argument。如果异常对象被称为e,那么调用e.getMessage返回这个字符串。

异常处理的一些方法

getMessage()

返回异常的详细信息

printStackTrace()

输出错误堆栈的信息,有助于定位出错的代码,会出现异常的类型和异常详细的信息以及出错的行数

toString()

返回异常的类型和异常的详细信息

getMessage()

toString()

printStackTrace()打印堆栈踪迹

预定义异常类

可以依靠自己的风格来给异常指定出错的类型

其中一些预定义异常类为:

BadStringOperationException:

ClassNoFoundExcepton:从字面意思上来讲是找不到对应的类

1.可能是路径错误 因为计算机不是人 它是根据你给定的路径是找文件的 而不是自己去找的

2.可能是文件名不存在或者是类名写错了

3.可能是放错了文件夹

IOException:输入文件路径找不到文件时的异常

NoSuchMethodException:意思是没有找到该包

  1. 根据提示查看方法是否存在
  2. 访问的方法是否受保护,我们用getDeclareMethod()来获取方法,getDeclaredMethod()作用是忽略权限修饰符。
  3. 检查此方法是否传了参数,类的方法有参数
  4. 检查类中的方法名字和Struts.xml文件中配置的名字相不相符合
  5. 清空浏览器缓存
  6. jar包的问题

SQLException:Spring中的异常

  1. 应用程序无法连接数据库
  2. 要执行的查询内容存在语法错误
  3. 查询中使用的表和或列不存在
  4. 试图插入或更新的数据违反了数据库的约束

异常分为2大类

运行时异常和编译时异常

运行时异常

  1. 指编译器不要求强制处理的异常。一般都是指编程时的逻辑异常,是程序员应该积极避免其出现的异常
  2. Java.lang.RunTimeException类及其它的子类都是运行时异常
  3. 我们可以编写代码处理(try...catch...finally)这样的异常,也可以不处理
  4. 对于这些异常,我们应该修正代码,而不是去通过异常处理器去处理(因为这样的异常发生的原因大多数是代码有问题)

比如一些

除0错误ArithmeticException

错误的强制类型转换错误ClassCastException

数组索引越界ArrayIndexOutBoundException

使用了空对象NullPointerException等等...

编译时异常

  1. 是指编译器要求必须处理的异常。即程序在运行时由外界因素造成的一般异常
  2. 编译器要求java程序必须捕获或声明所有编译时的异常
  3. 对于这类异常,如果程序不做处理的话,可能带来意想不到的结果
  4. Javac强制要求程序员为这样的异常做预备处理工作:(使用try...catch..finally或者throws)在方法中要么用try-catch语句进行捕获它并处理,要么用throws字句声明抛出它,否则编译不会通过 这样的异常一般由程序的运行环境导致的,因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用他编写的程序,于是程序员就应该为这样的异常时刻准备着

如:SQLException、IOException、ClassNOtFoundException等等

Throwable类: 所有异常类型 父类 即 Error/Exception

Error类: 程序本身无法恢复的严重错误 虚拟机错误 除了使程序安全退出,其他无能为力

Exception类: Java 应用程序抛出处理的非严重错误。分 子类有: 运行时异常/检查异常 (RuntimeException/Checked)

RuntimeException 类栈: 运行时异常;

不要求程序必须对其进行处理,如果产生异常,会输出异常 堆栈信息 并中止程序运行

常见错误类型:

ArithmeticException       算术错误情形,如以零作除数获得数无限大: 2/0;  或 2%0 都会报异常: / by zero (整除或除余0报错;)

ArrayIndexOutOfBoundsException 数组下标越界

         NullPointerException                        尝试访问 null 对象成员

         IllegalArgumentException               方法接收到非法参数

         ClassCastException                           对象强制类型转换出错

         NumberFormatException        数字格式转换异常,如把"abc"转换成数字

                                            ..............

         Checked  类: 检查异常(编译时就报错了,需要处理)

         程序必须捕获或者声明抛出这种异常否则编译错误;

                  Exception                                            异常层次结构的父类

                  SQLException                                     数据库链接...

                 ClassNotFoundException                          不能加载所需的类

异常的处理机制

异常处理:

为了避免程序执行的过程中出现异常,对可能发生异常的代码预先想好解决的一些处理办法,提前对可能会发送的异常进行捕获处理。

避免程序,出错导致程序结束

Finally语句块

当finally语句块在代码中执行的时候,将会产生三种可能的结果之一:

  1. Try语句块运行到它的末尾,没有抛出异常。这种情况下,finally语句块在try语句块后面执行。
  2. 在try语句块中抛出异常,并放置在try语句块后面的对应catch语句块中捕获异常,这种情况下,finally语句块在catch语句块执行之后执行。
  3. 在try语句块中抛出异常,但不存在匹配的catch语句块捕获该异常。方法调用结束,异常对象被抛给上层方法。这种情况下,finally语句块在方法结束执行前执行。
  4. 注意:你不能把简单地代码放在一串catch语句块 后面作为第三种情况

                                          

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值