1、Java中的异常概述
Java中的异常类给了程序一个处理错误的机会。异常处理会改变程序的控制流程,让程序可以对出现的错误进行处理。Java处理异常的时候,当程序运行出现异常的时候,Java运行环境就用异常内Exception的相应子类创建一个异常对象,并等待处理。具体来说是通过try-catch来实现的,将有可能出错的语句放在try语句中,但try中的语句出现异常的时候,try部分将立即结束执行,并且java运行环境就可以捕获一个异常对象,在转向执行相应的catch部分,因为这里放了处理相应异常的代码。
2、自定义异常类。
自定义的异常类,是Exception类的一个子类,在方法体中定义了异常的处理。再在另一个类中捕获这个异常,当出现异常的时候就可以使用关键字throws抛出。经过这样的声明就可以在自己的代码中使用这个类,并且可以捕获相应的异常。
自定义异常类的例子。
package Test2;
class MyException extends Exception{
String message;
MyException(int n){
message=n+" not a positive number";
}
public String getMessage(){
return message;
}
}
class DoSomething{
public void Sqrt(int n) throws MyException{
if(n<0){
MyException ex = new MyException(n);
throw(ex);
}
double number=Math.sqrt(n);
System.out.println(n+" sqrt is:"+number);
}
}
public class Test1 {
public static void main(String args[]){
DoSomething sqrt = new DoSomething();
try{
sqrt.Sqrt(28);
sqrt.Sqrt(-8);
}catch(MyException e){
System.out.println(e.getMessage());
}
}
}
3、在异常处理中throw和throws的区别
throw的作用
手动抛出异常,可能在Java程序中有的语句可能会导致一些jvm自身发现不了的异常,这是就要使用throw来声明抛出一个异常,在手动抛出一个异常之前需要先实例化一个异常对象然后才可以抛出。如下面代码所示。
int age = 0;
age = -100;
if(age<0)
{
Exception e = new Exception();//创建异常对象
throw e;//抛出异常
}
System.out.println(age);
throws的作用
声明方法可能回避的异常。有时候一个方法中产生了异常,但是不知道该怎么处理它,那么就放着不管,当有异常抛出时会中断该方法,而异常被抛到这个方法的调用者那里。这个有点像下属处理不了的问题就交到上司手里一样,这种情况称为回避异常
但是这使得调用这个方法就有了危险,因为谁也不知道这个方法什么时候会丢一个什么样的异常给调用者,所以在定义方法时,就需要在方法头部分使用throws来声明这个方法可能回避的异常。
但是这使得调用这个方法就有了危险,因为谁也不知道这个方法什么时候会丢一个什么样的异常给调用者,所以在定义方法时,就需要在方法头部分使用throws来声明这个方法可能回避的异常。
void fun()throws IOException,SQLException
{
...
}
这表示 fun方法可能会丢两个异常出来,那么在调用fun的时候可以做好准备。
4、异常的种类
检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
- 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
- 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
关于异常的一些其他基础可以参考:
http://www.w3cschool.cc/java/java-exceptions.html