java_note_Exception

JAVA异常

运行期出现的错误,而不是编译时出现的错误。
观察错误的名字和行号很重要。

eg.C 和C++ 在语法的级别上都不检查数组的越界。

数组越界异常:
java.lang.ArrayIndexOutofBoundsException

异常的概念:
1.JAVA异常是用于处理程序中错误的一种机制。
2.所谓错误是指在程序运行中发生的一些异常事件。
3.设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或者产生不可预见的结果。
4.JAVA的执行过程中如果出现异常事件,可以生成一个异常类对象,该对象封装了异常事件的信息并且将被提高给JAVA运行时系统,这个过程就是 抛出(throw)异常.
5.当java运行时系统接受到异常对象时,会寻找能处理这个异常的代码并把当前异常对象交给其处理,这个过程称为 捕获(catch)异常。

数学算法异常:
java.lang.ArithmeticException

语法规则:
eg:
...
try{
System.out.println(2/0);
}
// e是ArithmeticException的一个实例,其初始化是当出现异常时系统自动初始化。
catch(ArithmeticException e){
System.out.println("系统出现错误,请与管理员联系!");
e.printStackTrace();
}
..

例:
//throws关键字表示抛出异常
public int read() throws IOException


异常的分类:
Throwable为所有异常类的根类,位于 java.lang
Error 和 Exception 继承自跟类
Error是系统的错误,JVM出错,无法管理;
Exception表示可以处理的错误。
RuntimeException 继承自Exception.
RuntimeException表示经常出的,可以不用catch。
例如被0除,数组下标超出范围等
其他继承自Exception的异常表示必须要catch的异常:
如jdk中跟在类名之后表示抛出的异常

eg:
//
void m(int i) throws ArithmeticException{
if(i == 0){
throw new ArithmeticException("被除数为0");
}
}

异常的捕获和处理
1.try代码段包含可能产生 例外的代码。
2.try代码段后跟有一个或者多个catch代码段。
3.每个catch代码段声明其能处理的一种特定类型的异常并提供处理的方法。
4.当异常发生时,程序会中止当前的流程,根据获取异常的类型的类型去执行相应的catch代码段。
5.finally段的代码无论是否发生异常都有执行;通常finally语句中可能进行资源的清除工作,
如:关闭打开的文件;删除临时文件;……

eg:
...
FileInputStream in = null;
try{
in = new FileInputStream("myfile.txt");
int b ;
b = in.read();
while(b != -1){
System.out.print((char) b);
b = in.read();
}
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
System.out.print(e.getMessage());
} finally{
try{
in.close();
}catch(IOException e){
e.printStackTrace();
}
}
...

Java的例外处理机制:关键字throws
Java的例外处理机制使得例外事件,沿着被调用的顺序往前寻找,只要找到能够处理的方法为止。
任何方法都可以 throws Exception;包括public static void main()...
碰到exception尽量要处理,要有一个良好的编程习惯;
不能够处理的要抛出异常。
eg:
void f() throws FileNotFoundException IOException{
FileInputStream in = new FileInputStream("myfile.txt");
int b ;
b = in.read();
while(b != -1){
System.out.print((char)b);
b = in.read();
}
}

在一个异常中,一个异常的基类异常位于前面,则此异常不可能被捕获到,则编译时会出错。


使用自定义的异常
1.通过继承java.lang.Exception类声明自己的异常类。
2.在方法适当的位置生成自定义异常的实例,并用throw语句抛出。
3.在方法的声明部分用throws语句声明该方法可能抛出的异常。

eg:
class MyException extends Exception{
private int id;
public MyException(String message, int id){
super(message);
this.id = id;
}
public int getId(){
return id;
}
}
public class Test{
public void regist(int num) throws MyException{
if(num<0){
throw new MyException("the persons' number is nagetive,inpossible", 3);
}
System.out.println("regist persons:" + num);
}

public void manager(){
try{
regist(100);
}catch(MyException e){
System.out.println("regist error,the ID:" + e.getid());
e.printStackTrace();
}
System.out.print("operation is over!");
}

public static void main(String[] args){
Test t = new Test();
t.manager();
}
}

注意:
重写方法需要抛出与原方法所抛出异常类型一致的异常或者不抛出异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值