1.异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
异常分为两种,一种为编译异常,一种是运行异常,如下图所示:
红色:编译时异常
蓝色:运行时异常
NumberFormatException (数据类型不一致)
ArrayIndexOutOfBoundsException(缺少命令行参数)
ArithmeticException(算术异常)
ArrayStoreException(数组存储异常)
ArrayIndexOutOfBoundsException(下标超界)
这里为部分Exception异常的子类
回避异常:在方法声明中包含throws子句,通知潜在调用者,如果发生了异常,必须由调用者处理
如下所示:
"throws + 异常类型'写在方法声明处;
"throw new 异常类型",自定义异常;
一旦方法执行时,出现异常,仍会在异常代码处生成一个异常对象,此对象满足throws后异常类型时,就会抛出异常代码后续代码就不再执行了。
try-catch-finally
使用try将可能出现异常的代码包装起来,在执行的过程中,一旦出现异常,就会生成一个对应的异常类的对象,根据此对象的类型去catch中进行匹配
一旦匹配到某个catch时,就进入catch中进行异常处理
catch中的异常类型如果满足子父类关系,则要求子类一定要声明在父类的上面
常用异常对象处理方式:
1.String
2.e.getMessage
3.e.printStackTrace
注意:throw 的方法只是将异常抛给了方法的调用者,并没有真正将异常处理掉
但是try-catch-finally是真正的在处理异常
子类重写的方法抛出的异常类型不大于父类被重写方法抛出的异常
如果父类中被重写的方法没用throw方法,则子类也不能使用throw方式,意味着如果子类重写的方法中有异常,必须使用try-catch-finall方式处理
所以建议执行方法a中,先后调用了其他几个方法,这几个方法是递进的,建议这几个方法用throw的方式处理,a中用try-catch-finally来处理。
如下是我课上的例题:
实验二:编写应用程序ExceptionTest.java,接收命令行的两个参数,要求不能输入负数,计算两数相除。
对数据类型不一致(NumberFormatException)、缺少命令行参数(ArrayIndexOutOfBoundsException)、除0(ArithmeticException)及输入负数( NegativeInputException 自定义异常)进行异常处理
提示:
- 主类ExceptionTest中定义异常方法test完成两数相除功能。
- 在main()方法中使用异常处理语句进行异常处理
- 在程序中,自定义对应输入负数的异常类NegativeInputException
- 运行时接受参数 java ExceptionTest 20 10(即args[0]=“20”,args[1] = “10”)
- Integer类的static方法parseInt(String s)将s转换成对应的int值。如:int a = Interger.parseInt(“3.14”);//a = 3.14
package demo;
public class ExceptionTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
int num1 = Integer.parseInt(args[0]);
int num2 = Integer.parseInt(args[1]);
int result = dividing(num1,num2);
System.out.println(result);
}catch(NumberFormatException e) {
System.out.println("数据类型不一致");
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println("缺少命令行参数");
}catch(ArithmeticException e) {
System.out.println("除数不能为0");
}catch(NegativeInputException e) {
System.out.println(e.getMessage());
}
}
public static int dividing(int a,int b) throws NegativeInputException {
if(a<0||b<0) {
throw new NegativeInputException();
}
return a/b;
}
}
自定义异常类:
package demo;
public class NegativeInputException extends Exception {
static final long serialVersionUID = -33875164229948L;
public NegativeInputException() {
// TODO Auto-generated constructor stub
}
public NegativeInputException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
}