异常:就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
当程序中有异常时就需要进行异常处理
异常处理:java变成语言使用异常处理机制为程序提供了错误处理的能力
异常处理的关键字:
try、catch、finally、throw、throws
异常实例1:除数与被除数(除数不能为0)
异常处理
public static void main(String[] args) {异常处理实例2:
//包裹可能会出现的bug(异常)的代码
try{
Scanner sc = new Scanner(System.in);
System.out.print("请输入被除数:");
int a = sc.nextInt();
System.out.print("请输入除数:");
int b = sc.nextInt();
System.out.println("运算结果:"+a/b);
}catch(InputMismatchException ie){
//输入内容不匹配的情况,就会进入这个异常处理
System.out.println("输入的是非整数");
}catch(ArithmeticException ae){
//除数是零的时候,算数出现错误异常时,就会进入这个异常处理
System.out.println("除数不能为0");
}catch(Exception e){
//除了上边出现的错误以外,其他任何异常发生,就会进入到这个异常处理
System.out.println("程序出现未知错误");
}finally{
//b不管程序有没有异常,最终都要执行finally代码
//finally是最终执行的代码块
System.out.println("谢谢使用!");
}
}
try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,是在return前还是后?( A ) A,会执行,在return之后执行 B,不会执行,return直接返回 C,会执行,在return之前执行 D,需要根据具体判断写一个实例来看:
public class Ch02 {运行结果:
public static int test(){
int a;
try{
a = 10;
return a;
}finally{
System.out.println("aaaaaaaaaaa");
a = 20;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(test());
}
}
从运行结果可以看出:
try{}里有一个return语句,
那么紧跟在这个try后有finally{},
会执行finally代码,
但会在return之后
在异常处理的关键词中有throw和throws两个自定义异常
通过两个实例来解释两个关键字
1.关键字throws
public class Ch03 {2.关键字throw
/**
* throws
* 明显提示异常信息
* 声明方法可能会出现的异常
* 调用者必须要解决这些异常
* @throws ArithmeticException
* @throws InputMismatchException
* @throws Exception
*/
public static void test() throws ArithmeticException,InputMismatchException,Exception{
Scanner sc = new Scanner(System.in);
System.out.print("请输入被除数:");
int a = sc.nextInt();
System.out.print("请输入除数:");
int b = sc.nextInt();
System.out.println("运算结果:"+a/b);
}
public static void main(String[] args) {
try {
test();
} catch (InputMismatchException e) {
// TODO Auto-generated catch block
//打印错误提示信息
e.printStackTrace();
} catch (ArithmeticException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Ch04 {
/**
* throw
* 不明显提示异常信息
* 作用:手动抛出异常
* 程序本身可能没有异常,但是不符合业务逻辑时
* 可以手动抛出异常
* @throws ArithmeticException
* @throws InputMismatchException
* @throws Exception
*/
public static void test(){
Scanner sc = new Scanner(System.in);
System.out.print("请输入被除数:");
int a = sc.nextInt();
System.out.print("请输入除数:");
int b = sc.nextInt();
if(b == 1){
throw new CanNotBeOneException();
}
if(b == 0){
throw new ArithmeticException("除数不能为0");
}
System.out.println("运算结果:"+a/b);
}
public static void main(String[] args) {
test();
}
}
/**
* 自定义异常
* @author Administrator
*
*/
class CanNotBeOneException extends RuntimeException{
public CanNotBeOneException() {
super("除数不能为1");
// TODO Auto-generated constructor stub
}
}
java中异常的分类:
分为check异常(必须解决)和运行异常(可以不解决)
下面写一个实例解释一下
public class Ch05 {最后说一下异常处理的注意事项:
public void test(int a,int b) throws AException{
//计算两数之商
if(a == 0){
//runtime异常可以不解决
throw new BException();
}
if(b == 0){
//check异常,必须解决
throw new AException();
}
}
}
/**
* checked异常,必须要解决
* @author Administrator
*
*/
class AException extends Exception{
public AException() {
super();
// TODO Auto-generated constructor stub
}
public AException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
}
/**
* 运行时异常,可以不解决
* @author Administrator
*
*/
class BException extends RuntimeException{
public BException() {
super();
// TODO Auto-generated constructor stub
}
public BException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
}