异常处理

1、异常是运行可能出现的错误,运行时捕捉的异常Exception,不是编译错误error语法错误。
2、怎么处理异常?处理机制

当整个程序,一旦发现某一部分出错,整个程序的流程打断,寻找有没有对异常处理代码,若没有继续调到调用函数的程序找。若没有再回到main函数找,没有则抛给jvm,给显示器输出。异常是对象。
在这里插入图片描述
优点:通过try{} catach(){}将错误的捕捉和处理,处理错误的能力增强。健壮性强。传统利用if语句,若。。。则。。。只能把想到错误考虑,可读性差,出错返回信息少。异常并不是能解决所有问题
总之:考虑程序的安全性和健壮性
增强对程序的可控性
有利用code调试
把错误代码从常规代码中分离出来
缺点:

try{
可能出错的代码aa.divide(6,0); //jvm自动生成异常对象
}
catch(错误ArithmetiException e) //e用来接收上面抛出的异常对象,不允许抛出两个异常。。。
{
e.printfStackTrace();//输出异常的具体信息
System.out.printf(“程序中除数为零的错误”);//对错误的处理,处理完下面程序继续运行!
}
下面的代码仍可以运行!
异常的分类:
运行时抛出异常均是Exception(是程序员可以捕捉并处理的异常)的子类。
RuntimeException是可处理可不处理的异常.
凡是继承Exception但又不是RuntimeException的子类的异常,通常必须进行捕捉并处理。
检查异常(checked exception):除了Error 和 RuntimeException的其它异常。javac强制要求程序员为这样的异常做预备处理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。
在这里插入图片描述
3、为什么用trycatch{}不用if…else…
无法事先确定数据什么情况,无法进行处理。

package java_part;

import java.util.*;
public class TestExcep_3{
     public static void main(String[] args){
          Scanner sc =new Scanner(System.in);
          try {
            int i = sc.nextInt () ;
            System.out.printf("i=%d\n",i);
 
           }
         catch(InputMismatchException e){
 
           System.out.printf("输入数据不合法");
    
          }

   }

}

3、异常处理的两种方法
throw抛出异常对象,throw是语句抛出一个异常,一般是在代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常.
throw new IOException
throws当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理,表示本方法不处理,交给被调用者处理。
对于f内部也可以自行处理,利用try catch自己处理。
对比:
1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

public class testThrows(){
public static void function() throws NumberFormatException{ 
String s = "abc"; 
System.out.println(Double.parseDouble(s)); 
} 

public static void main(String[] args) { 
try { 
function(); 
} catch (NumberFormatException e) { 
System.err.println("非数据类型不能强制类型转换。"); 
//e.printStackTrace(); 
} 
}

4、finally
无论catch{}是否,finally代码一定输出。
为什么利用finally?
在这里插入图片描述
5、自定义异常
(1)继承Excepyion
(2)定义构造方法,利用super()

import java.io.*;
class DivisorIsZeroException extends Exception
{
	public DivisorIsZeroException(String name)
	{
		super(name);
	}
}
class A
{
	public int divide(int a, int b) throws DivisorIsZeroException
	{
		int m = 0;		
		if (0 == b)
			throw  new DivisorIsZeroException("除数不能为零! O(∩_∩)O哈哈~");
		else
			m = a/b;
			
		return m;
	}
}
public class TestExcep_7
{
	public static void main(String[] args) //throws IOException
	{
		A aa = new A();				
		try
		{
			aa.divide(6, 0);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}		
	}
}

throws函数抛出异常,不对异常进行处理,让被调用处理,方法内部也可以不抛出异常,所以也不一定对异常(关键是什么异常,RuntimeException可以不处理)进行处理。
throws时候并不一定就必须throw异常,调用函数也不一定进行对异常捕获。这样不太好。
总之:1、若自己定义的方法中,函数f内部用throw,函数声明处最好加throws;
2、若要调用一个函数,其中利用了throws,无论函数抛出的异常是什么异常,都需要在调用的函数中进行try catch处理。

子类继承父类,父类抛出异常A,B。子类抛出异常的范围不能超过父类。因为多态。父类的引用可以指向父类对象,想把子类中所有f方法调用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值