2022.01.13Java异常处理
2022.01.13每日总结
1.异常处理习题:
编写应用程序EcmDef.java,接收命令行的两个参数,要求不能输入负数,计算 两数相除。
对 数 据 类 型 不 一 致 (NumberFormatException) 、 缺 少 命 令 行 参 数 (ArrayIndexOutOfBoundsException、
除0(ArithmeticException)及输入负数(EcDef 自定义的异常)进行异常处理。
提示: (1)在主类(EcmDef)中定义异常方法(ecm)完成两数相除功能。
(2)在main()方法中使用异常处理语句进行异常处理。
(3)在程序中,自定义对应输入负数的异常类(EcDef)。
(4)运行时接受参数 java EcmDef 20 10 //args[0]=“20” args[1]=“10” (5)Interger类的static方法parseInt(String s)将s转换成对应的int值。 如:int a=Interger.parseInt(“314”); //a=314;
题解:
//第一步:自定义异常类
//提供序列版本号 //继承现有的异常结构 //提供构造器 public class EcDef extends RuntimeException{ static final long serialVersionUID = -7034897190745712139L; public EcDef(){ } public EcDef(String message){ super(message); } }
//第二步:编写EcmDef主类:
public class EcmDef { public static void main(String[] args) { try { int j = Integer.parseInt(args[1]); int i = Integer.parseInt(args[0]); 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()); } } public static int ecm(int i,int j) throws EcDef{ if(i<0 || j <0){ throw new EcDef("分子或分母为负数了!"); } return i/j; } }
2.Java的runconfiguration
Java的runconfiguration是指Java的运行配置,Java程序启动时即可为程序添加参数,
public class Test{ public static void main (String[] args){ System.out.println(args[0]); System.out.println(args[1]); System.out.println(args[2]); } }
该程序需在启动时传递设置参数,输出如下:
D:\> java Test aaa bbb ccc
aaa
bbb
ccc
eclipse和idea可在程序启动前设置参数,打开runconfiguration把111 222 333填入Program arguments中再运行即可
3.异常处理机制:
①try 捕获异常的第一步是用try{…}语句块选定捕获异常的范围,将可能出现 异常的代码放在try语句块中。
catch (Exceptiontype e) 在catch语句块中是对异常对象进行处理的代码。每个try语句块可以伴随 一个或多个catch语句,用于处理可能产生的不同类型的异常对象。
如果明确知道产生的是何种异常,可以用该异常类作为catch的参数;也可 以用其父类作为catch的参数。
比 如 : 可 以 用 ArithmeticException 类 作 为 参 数 的 地 方 , 就 可 以 用 RuntimeException类作为参数,或者用所有异常的父类Exception类作为参数。 但不能是与ArithmeticException类无关的异常,如NullPointerException(catch 中的语句将不会执行)。
finally 捕获异常的最后一步是通过finally语句为异常处理提供一个 统一的出口,使得在控制流转到程序的其它部分以前,能够 对程序的状态作统一的管理。
不论在try代码块中是否发生了异常事件,catch语句是否执 行,catch语句是否有异常,catch语句中是否有return, finally块中的语句都会被执行。
finally语句和catch语句是任选的
②声明抛出异常是Java中处理异常的第二种方式
如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这 种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理, 而由该方法的调用者负责处理。 在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可 以是方法中产生的异常类型,也可以是它的父类。
声明抛出异常举例:
public void readFile(String file) throws FileNotFoundException { …… // 读文件的操作可能产生FileNotFoundException类型的异常 FileInputStream fis = new FileInputStream(file); ..…… }
4.throws和throw的区别
public static int ecm(int i,int j) throws EcDef{ if(i<0 || j <0){ throw new EcDef("分子或分母为负数了!"); } return i/j; } }
使用位置不一样,
一个是方法声明后面,表示向上抛出异常直至main方法,由调用者处理;不一定发生
一个是方法体内跟的是异常对象名,由方法体内的语句处理;一定发生