p.378
过程一:”抛“,在程序正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应的异常类的对象,并将此对象抛出。一旦抛出对象以后,其他代码就不再执行。
过程二:“抓”,可以理解为异常的处理方式 ①try-catch-finally ②throws
try{
? //可能出现异常的代码
}catch(异常类型1 变量名1){
? //处理异常的方式1
}catch(异常类型2 变量名2){
? //处理异常的方式2
}catch(异常类型3 变量名3){
? //处理异常的方式3
}
......
finally{
? //一定会执行的代码
}
说明
体会:开发中,由于运行时异常比较常见,所以我们通常就不针对运行时异常编写try-catch-finally。针对编译时异常,我们说一定要考虑异常的处理。
"throws+异常类型"写在方法的声明处,指明此方法执行时,可能会抛出的异常类型。出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出.异常代码后续的代码,就不会执行!
体会:try-catch-finally:真正的将异常给处理掉
? throws:只是将异常抛给了方法的调用者,并没有将异常处理掉.
开发中如何选择使用try-catch-finally 还是使用throws?
如果父类中被重写的方法没有throws方式处理的异常,则子类中处理的方法也不能有throws.意味着子类如果重写的方法有异常,必须使用try-catch-finally方式处理.
执行的方法a中,先后调用了另外几个方法,这几个方法是递进关系执行的.我们建议这几个方式用throws的方式处理.而执行的方法a中可以考虑使用try-catch-throws的方式处理。
throw new runtimeExpection("你输入的数据非法!")
继承于现有的异常结构:RuntimeException、Exception
提供全局常量:serialVersionUID
提供重载的构造器
求2个数相除;要求:除数和被除数均不能为负数;除数不能为0.
package com.yicurtain.Exception;
public class Ecdef extends Exception{
static final long serialVersionUID = -338751699312422948L;
public Ecdef(){
}
public Ecdef(String msg){
super(msg);
}
}
主函数求解
package com.yicurtain.Exception;
import java.util.Scanner;
public class EcmDef {
public static void main(String[] args) {
try {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入被除数与除数:");
while (scanner.hasNextInt()) {
int i = scanner.nextInt();
int j = scanner.nextInt();
int result = ecm(i, j);
System.out.println("结果为:"+result);
}
}catch(Ecdef e){
e.printStackTrace();
}catch(ArithmeticException e){
e.printStackTrace();
}
}
public static int ecm(int i,int j) throws Ecdef{
if (i<0||j<0){
throw new Ecdef("输入的数不能为负数!");
}
return i/j;
}
}
原文:https://www.cnblogs.com/yicurtain/p/14880787.html