声明抛出异常
声明抛出异常是Java中处理异常的第二种方式
如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显式地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
在方法声明中用 throws 子句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。
声明抛出异常举例:
public void readFile(String file) throws FileNotFoundException {
……
// 读文件的操作可能产生FileNotFoundException类型的异常
FileInputStream fis = new FileInputStream(file);
..……
}
public class Test8_5 {
public static void main(String[] args) {
Test8_5 t = new Test8_5();
try{
t.readFile();
}catch(IOException e){ }
}
public void readFile()throws IOException {
FileInputStream in=new FileInputStream("myfile.txt");
int b;
b = in.read();
while(b!= -1) {
System.out.print((char)b);
b = in.read();
}
in.close();
}
}
重写方法声明抛出异常的原则
重写方法不能抛出比被重写方法范围更大的异常类型
public class A {
public void methodA() throws IOException {
……
}
}
public class B1 extends A {
public void methodA() throws FileNotFoundException {
……
}
}
public class B2 extends A {
public void methodA() throws Exception { //error
……
}
}
1 public class TestThrows { 2 public static void main(String[] args) { 3 try { 4 test(); 5 } catch (Exception e) { 6 e.printStackTrace(); 7 } 8 } 9 //1. 在 Java 中使用 throws 关键字声明抛出异常. 10 //2. throws 方法抛出的异常可以是方法中出现的异常的类型或其父类类型. 11 //3. throws 可以声明抛出多个异常, 多个异常使用 , 分割. 12 public static void test() throws FileNotFoundException, SQLException { 13 //4. 运行时异常不需要使用 throws 关键字进行显式的抛出. 14 int i = 10 / 0; 15 System.out.println(i); 16 17 //编译时异常 18 InputStream fs = new FileInputStream("abc.txt"); 19 20 Connection connection = null; 21 String sql = null; 22 PreparedStatement ps = connection.prepareStatement(sql); 23 24 byte [] buffer = new byte[fs.available()]; 25 fs.read(buffer); 26 27 //要求异常处理是一致的,不能抛出比被重写方法范围更大的异常类型 28 A a = new B(); 29 try { 30 a.method(); 31 } catch (FileNotFoundException e) { 32 e.printStackTrace(); 33 } 34 } 35 } 36 37 class A { 38 void method () throws FileNotFoundException { 39 } 40 } 41 //5. 重写方法不能抛出比被重写方法范围更大的异常类型 42 class B extends A { 43 // @Override 44 // void method() throws IOException { 45 // } 46 }
人工抛出异常
Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要人工创建并抛出
首先要生成异常类对象,然后通过throw语句实现抛出操作(提交给Java运行环境)。
IOException e =new IOException();
throw e;
可以抛出的异常必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误:
throw new String("want to throw");
创建用户自定义异常类
用户自定义异常类MyException,用于描述数据取值范围错误信息。用户自己的异常类必须继承现有的异常类。
class MyException extends Exception {
private int idnumber;
public MyException(String message, int id) {
super(message);
this.idnumber = id;
}
public int getId() {
return idnumber;
}
}
使用用户自定义异常类
public class Test8_6 {
public void regist(int num) throws MyException {
if (num < 0) {
throw new MyException(“人数为负值,不合理”,3);
}else {
System.out.println("登记人数" + num );
}
}
public void manager() {
try {
regist(100);
} catch (MyException e) {
System.out.print("登记失败,出错种类"+e.getId());
}
System.out.print("本次登记操作结束");
}
public static void main(String args[]){
Test8_6 t = new Test8_6();
t.manager();
}
}
1 /** 2 * 人工手动抛出异常: 3 * 1. 创建一个异常类对象 4 * 2. 在方法内部使用 throw 关键字把该异常类对象抛出去! 5 * 6 * 自定义的异常类: 7 * 1. 通常继承自 RuntimeException(可以继承 Exception) 8 * 2. 自定义的异常类就是用来被人工抛出的! 9 */ 10 public class TestThrow { 11 public static void main(String[] args) { 12 try { 13 inputAge(); 14 } catch (Exception e) { 15 System.out.println(e.getMessage()); 16 } 17 18 System.out.println("end..."); 19 } 20 21 /** 22 * 输入年纪: 要求年纪必须在 15-30 之间, 超出 30 则年纪偏大 23 */ 24 public static void inputAge(){ 25 Scanner sc = new Scanner(System.in); 26 27 System.out.print("age="); 28 int age = sc.nextInt(); 29 30 if(age > 30){ 31 // System.out.println("年纪偏大."); 32 throw new AgeTooLargeException("年纪偏大."); 33 } 34 } 35 36 public static void test(){ 37 38 //1. 创建一个异常类对象 39 RuntimeException ex = new RuntimeException(); 40 41 //2. 把异常类对象抛出去 42 throw ex; 43 } 44 }
1 //自定义的异常类: 1. 通常继承自 RuntimeException(可以继承 Exception) 2 public class AgeTooLargeException extends RuntimeException{ 3 4 private static final long serialVersionUID = 1L; 5 6 public AgeTooLargeException() { 7 } 8 9 public AgeTooLargeException(String msg) { 10 super(msg); 11 } 12 }