首页 > 代码库 > Java基础学习 -- 异常

Java基础学习 -- 异常

通过例子来理解:

package exception;

public class ExceptionCatch {
    private String s = null;
    public static void main(String[] args) {
        ExceptionCatch ec = new ExceptionCatch();
        try {
            ec.s.toString();
        }catch(Exception e) {
            System.out.println("Caught exception: "+e);
        }
    }
}
// Output: Caught exception: java.lang.NullPointerException

 

 1 package exception;
 2 
 3 //注意观察两个异常类构造器的区别。

  /**
  * 推断

  * 第一个异常类是自己定义了一个String变量,在构造的时候是将信息传给了这个变量;
  * 而第二个异常类的构造器是覆盖了父类的构造方法,所以我们猜测,父类Exception里一定有一个String类型的成员变量(这个成员变量同样继承给了MyException子类),
  * 所以在构造的时候利用super()将父类的构造方法取过来,进而将信息传给了父类里的那个String成员变量。
  * 而getMessage()方法也是从父类那里继承来的,进而我们推断:getMessage()方法返回的正是那个String变量。
 * 在第一个异常类的那个从父类继承的String变量并没有被赋值,所以通过getMessage()取到的是null。
  */
 4 class MyException extends Exception {
 5     String msg;
 6     public MyException(String msg) {
 7         this.msg = msg;
 8     }
 9     public void printMsg() {
10         System.out.println("msg = " + msg);
11     }
12 }
13 
14 class MyException2 extends Exception {
15     public MyException2(String s) { 
16         super(s); 
17     }
18 }
19 
20 public class E04_ExceptionClass {
21     public static void main(String args[]) {
22         try {
23             throw new MyException("MyException message");
24         } catch(MyException e) {
25             e.printMsg();
26             System.out.println("e.getMessage() = " + e.getMessage()); //输出为null。
27         }
28         
29         try {
30             throw new MyException2("MyException2 message");
31         } catch(MyException2 e) {
32             System.out.println("e.getMessage() = " + e.getMessage());
33         }
34     }
35 }
36 /*Output:msg = MyException message
37  *       e.getMessage() = null
38  *       e.getMessage() = MyException2 message
39  */

   一个方法里如果会抛出异常,则必须在其方法后面声明 throws 异常名 。如果不声明则必须在这个方法里通过 try{}catch{} 将异常处理掉。

  一个方法可以声明多个异常抛出 throws 异常1 , 异常2 ,但是在以后调用该方法时必须有多个catch来捕捉不同的异常。温馨提示:往往在编程时,会把所有可能会有的异常(现在会有的和以后可能会有的)全都声明在方法之后,这是一种习惯。因为在后期在对该方法进行功能扩展时可能会遇到出现这些异常,而当时在声明这些异常之后编译器会提示你将这些异常一一catch,所以这时你只需要填补catch里的处理内容,这会来带一定的便利。

  下面是一个示例:

package exception;

class OpenException extends Throwable {}
class CloseException extends Throwable {}

public class c {
    public static int open() {
        return -1;
    }
    
    public static void readFile() throws OpenException,CloseException {
        if(open() == -1) throw new OpenException();
    }
    
    public static void main(String[] args) {
        try {
            readFile();
        } catch (OpenException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (CloseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
}

 

Java基础学习 -- 异常