本质上并没有什么关系,只是throw抛出一个异常对象,throws就得处理而已。
- throw表示抛出一个异常类的对象,生成异常类对象的过程;声明在方法体内。
- throws:属于异常处理的一种方式,声明在方法的声明处。
简单理解其实就是使用throw抛出一个异常类的对象等待处理,然后throws就是处理方式,只不过它的方式是把这个异常丢出去给别人处理。
eg:
//创建一个ecm(),来计算i / j;可能会有输入数据不符合除法运算的可能性,所以就需要throw一个异常对象,然后ecm()就需要采用throws方式处理这个异常
//此处的EcDef是自定义的异常类,throw了一个EcDef异常对象
public static int ecm(int i,int j) throws EcDef{//非运行时异常
if(i < 0 || j < 0){
throw new EcDef("分子/分母为负数了");
}
return i / j;
}
//main()中对抛出的异常做处理
public static void main(String[] args) {
try {
int i = Integer.parseInt(args[0]);//String类型转换为int
int j = Integer.parseInt(args[1]);
int result = ecm(i, j);
System.out.println(result);
}catch(NumberFormatException e){
System.out.println("数据类型不一致");
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("缺少命令行参数");
}catch(ArithmeticException e){
System.out.println("除0");
}catch(EcDef e){
System.out.println(e.getMessage());
}
//自定义异常类EcDef继承Exception
/*如何自定义异常类?
* 1.继承现有的异常结构:RuntimeException、Exception
* 2.提供全局常量:SerialVersionUID
* 3.提供重载的构造器
*/
public class EcDef extends Exception{//继承Exception类
static final long serialVersionUID = -7984116164661L;//设置一个全局变量SerialVersionUID
public EcDef(){}
public EcDef(String msg){//提供重载的构造器
super(msg);
}
}