版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1434897
接上篇《JavaSE 基础学习之三 —— Java 的继承与接口》
注:
所有的异常产生之后,都是一个类的实例对象,而且这些异常全部继承于 Exception;java 中对所有的异常都进行了细致分类,每种异常都有一个具体的类。
- getMessage(): 返回此 throwable 的详细消息字符串;
- toString():返回此 throwable 的简短描述。
- printStackTrace():打印异常的堆栈,将此 throwable 及其追踪输出至标准错误流;
finally 关键字后无论有没有异常,最终都要执行的操作;
例:
public class Demo1 {
public static void main(String[] args) {
try {
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
System.out.println(a/b);
} catch (ArrayIndexOutOfBoundsException e) {
// TODO: handle exception
System.out.println("数组下标越界");
} catch (ArithmeticException e) {
System.out.println("除数不能为 0");
} catch (Exception e) {
System.out.println(e.getMessage());
System.out.println(e);
System.out.println("其他异常");
} finally {
System.out.println("无论有没有异常,最终都要执行的操作");
}
}
}
throw 关键字表示在某种情况下,我们自己手动抛出的异常实例;
例:定义一个 Person 类,对其年龄进行设置,如果年龄超过 120,则认为出现错误,手动抛出异常。
public class Person {
private int age = 10;
public int getAge() {
return age;
}
public void setAge(int age) throws Exception{
try {
if(age < 0 || age > 120) {
throw new Exception("年龄有误");
} else {
this.age = age;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
如果运行了程序 setAge(130),则会抛出“年龄有误”的异常。
throws 关键字在一个方法的方法签名后面使用,用处在于通过编译,告诉使用者一旦调用了当前方法,可能出现处理哪些异常,这样可以令使用者尽量的回避异常;当你的方法里抛出了 checked 异常,如你不 catch,代表你当时不处理(不想处理或没条件处理),但你必须得通过”throws那个异常”告诉系统说,这儿有个问题,我现在不处理,将来一定别人要处理,否则执行到它,系统会”不优雅”的崩溃。
举个例子,工兵张三发现了地雷,假如他处理完就完事儿了。但是他发现了地雷,自己却没带齐工具,没法处理,他必须做个标记,说这儿有一个地雷,别的工兵将来一定要处理,否则将来有人踩上去会爆炸。
注意:throws只是标记,并没处理,程序执行到那里,系统还是会崩溃!
例:
public class Person1 {
private int age;
// throws 异常,通知此处代码有问题
public void setAge(int age) throws Exception{
if(age < 0 || age > 120)
throw new Exception("年龄有误!");
this.age = age;
}
public int getAge() {
return age;
}
}
项目中,我们可以通过创建一个类继承 jdk 提供的异常类 (RunTimeException 或 Exception),自定义的实现一个异常类。
自定义异常的创建有利有弊:优点如下:
自定义异常的缺点主要在于,发现异常、抛出异常以及处理异常的工作必须靠编程人员在代码中利用异常处理机制自己完成。这样就相应的增加了一些开发成本和工作量,所以项目没必要的话,也不一定非得要用上自定义异常,要能够自己去权衡。
关于自定义异常,可以参考《Java异常之自定义异常》的博客。
建议:
- 例如:throw new IOException(“Writing data error! Data: ” + data.toString());在程序中,选择使用异常处理还是错误返回码处理,应该根据是否有利于程序结构来确定,且不能将异常和错误码混合使用。通常情况下
强烈建议:
public void sample() {
try {
// 某个抛出异常块
}
// 处理异常种类 1
catch (IllegalStateException illEx) {
log.wirte(illEx.printStackTrace());
throw illex;
}
// 处理异常种类 2
catch (SQLException SQLEx) {
log.write(SQLEx.printStackTrace());
throw SQLEx;
}
finally {
// 释放资源
}
}
接下篇《JavaSE 基础学习之五 —— IO 操作》