珠海网站优化培训,网站建设制作公司,软件开发工程师招聘简章,组织建设情况怎么写在编写程序时#xff0c;经常要在可能出现错误的地方加上检测的代码#xff0c;如进行x/y运算时#xff0c;要检测分母为0#xff0c;数据为空#xff0c;输入的不是数据而是字符等。过多的if-else分支会导致程序的代码加长、臃肿#xff0c;可读性差。因此采用异常处理机…在编写程序时经常要在可能出现错误的地方加上检测的代码如进行x/y运算时要检测分母为0数据为空输入的不是数据而是字符等。过多的if-else分支会导致程序的代码加长、臃肿可读性差。因此采用异常处理机制。
Java采用的异常处理机制是将异常处理的程序代码集中在一起与正常的程序代码分开使得程序简洁、优雅并易于维护。 Java提供的是异常处理的抓抛模型。
Java程序的执行过程中如出现异常会生成一个异常类对象该异常对象将被提交给Java运行时系统这个过程称为抛出(throw)异常。
异常对象的生成抛出 ①由虚拟机自动生成程序运行过程中虚拟机检测到程序发生了问题如果在当 前代码中没有找到相应的处理程序就会在后台自动创建一个对应异常类的实例 对象并抛出——自动抛出 ②由开发人员手动创建Exception exception new ClassCastException();——创 建好的异常对象不抛出对程序没有任何影响和创建一个普通对象一样 如果一个方法内抛出异常该异常对象会被抛给调用者方法中处理。如果异常没有在调用者方法中处理它继续被抛给这个调用方法的上层方法。这个过程将一直继续下去直到异常被处理。这一过程称为捕获(catch)异常。如果一个异常回main()方法并且main()也不处理则程序运行终止。 Java异常处理的方式
方式一try-catch-finally 方式二throws 异常类型 通过try-catch-finally(finally可选)方式
try{//可能出现异常的代码
}catch(异常类型1 变量名e){//处理异常的方式1
}catch(异常类型2 变量名e){//处理异常的方式2
}
......
finally{//一定会执行的代码
}如果明确知道产生的是何种异常可以用该异常类作为catch的参数也可以用其父类作为catch的参数。比 如 可 以 用 ArithmeticException 类 作 为 参 数 的 地 方 就 可 以 用RuntimeException类作为参数或者用所有异常的父类Exception类作为参数。但不能是与ArithmeticException类无关的异常。NullPointerExceptioncatch中的语句将不会执行。
使用try将可能出现异常代码包装起来在执行过程中一旦出现异常 就会生成一个对应异常类的对象根据此对象的类型去catch中进行匹配。一旦try中的异常对象匹配到某一个catch时 就进入catch中进行异常的处理。处理完成就跳出当前的try-catch结构(在没有写finally的情况)。继续执行其后的代码。
catch中的异常类型如果没有子父类关系则谁声明在上谁声明在下无所谓。 catch中的异常类型如果存在子父类关系则要求子类一定声明在父类的上面否则会报错。
异常对象处理一般写在catch语句里面如e.printStackTrace(): ①返回String的getMessage() 获取异常信息。 ②没有返回值的printStackTrace()获取异常类名和异常信息以及异常出现在程序中的位置。
在try结构中声明的变量再出了try结构以后就不能再被调用。
try-catch-finally结构可以嵌套。
使用try-catch-finally处理编译时异常是得程序在编译时就不再报错但是运行时仍可能报错。相当于我们使用try-catch-finally将一个编译时可能出现的异常延迟到运行时出现。 开发中由于运行时异常比较常见所以我们通常不针对运行时异常编写try-catch-finally。而针对于编译时异常一定要考虑异常的处理。 通过throws方式
throws 异常类型写在方法的声明处指明此方法执行时可能会抛出的异常类型。一旦当方法体执行时出现异常会在异常代码处生成一个异常类的对象此对象满足throws后写的异常类型时就会被抛出。异常代码后续的代码不再执行。
public void readFile(String file) throws FileNotFoundException {......// 读文件的操作可能产生FileNotFoundException类型的异常FileInputStream fis new FileInputStream(file);......
}try-catch-finally真正地将异常给处理掉了。 throws的方式只是将异常抛给了方法的调用者并没有真正将异常处理掉。
重写方法不能抛出比被重写方法范围更大的异常类型。在多态的情况下对methodA()方法的调用-异常的捕获按父类声明的异常处理。
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 { //报错......}
}如果父类中被重写的方法没有throws方式处理异常则子类重写的方法也不能使用throws意味着如果子类重写的方法中有异常必须使用try-catch-finally方式处理。 手动抛出生成创建异常throw
Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出也可根据需要使用人工创建并抛出。
首先要生成异常类对象然后通过throw语句实现抛出操作(提交给Java运行环境)。例如
IOException e new IOException();
throw e;或者直接
throw new IOException();用户自定义异常类
一般地用户自定义异常类都是RuntimeException的子类。 自定义异常类必须继承现有的异常类。 自定义异常类通常需要编写几个重载的构造器。 自定义异常需要提供serialVersionUID。 自定义的异常通过throw抛出。
例子
class MyException extends Exception {static final long serialVersionUID 13465653435L;private int idnumber;public MyException(String message, int id) {super(message);this.idnumber id;}public int getId() {return idnumber;}
}public class MyExpTest {public void regist(int num) throws MyException {if (num 0)throw new MyException(人数为负值不合理, 3);elseSystem.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[]) {MyExpTest t new MyExpTest();t.manager();}
}