Java异常

什么是异常?

   异常是程序在运行或编译时,任何中断正常程序流程的错误,主要是语法错误和语义错误。但错误和异常是不同的,错误它指的是一个合理的应用程序不能截获的严重的问题,是很难解决的。在Java中异常Exception和错误Error有个共同的父类Throwable

异常的分类

  java中的异常可分为两类:运行时异常和编译时异常。

运行时异常是RuntineException类及其子类,当出现这种错误时,编译器是不会去检查它的。

编译时异常是除了RuntineException类及其子类外的其他Exception类及其子类,当出现这种错误时,编译器会检查它,这种异常的特点是要么用try...catch捕获处理,要么用throws语句声明抛出,否则编译不会通过。

 

异常处理机制

  Java异常处理是通过5个关键字来处理的。它们是trycatchthrowthrowsfinally。其中trycatch要一起使用,不能单独使用。

 

运行时异常的处理方法

  对于这类异常,我们不需要异常处理的关键字来处理,而是在程序编写时,尽量去避免这种异常,一旦发现该异常,正确的做法就是改进程序设计的代码和实现方式,修改程序中的错误,从而避免这种异常。 

 

编译时异常的处理方法

1.使用trycatch、finally

  try来捕获可能出现的异常的语句,catch是出现异常时的处理方法。在程序中使用的格式为:

     try

     {

      可能发生异常的代码块;

     }

      catch(异常类型异常对象名)

     {

      异常处理代码块;

     }

    ......

     ......

     catch(异常类型异常对象名)

     {

      异常处理代码块;

     }//可有可无

     finally{

      //不管是否出现异常,都将执行finally中的语句
    }

 

当我们在使用这三个关键字时要注意以下几点:

第一、try语句不能单独存在,可以和catchfinally组成 try...catch...finallytry...catchtry...finally三种结构,catch语句可以有一个或多个,finally语句最多一个,trycatchfinally这三个关键字均不能单独使用。
第二、trycatchfinally三个代码块中变量的作用域分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。
第三、多个catch块时候,Java虚拟机会匹配其中一个异常类或其子类,就执行这个catch块,而不会再执行别的catch块。

 

 
public static void main(String[] args) {
		 // TODO Auto-generated method stub 
		      int[] array = new int[]{1,2,3,4};
		    try
		      { 
		        System.out.println(array[4]); 
		     }
		   catch (NullPointerException e)
		    { 
			   System.out.println(e.toString()); 
		    }
		   catch (ArrayIndexOutOfBoundsException e)
		   {
			   System.out.println(e.getMessage()); e.printStackTrace(); 
		   }
		   finally 
		   { 
			   System.out.println("出现异常!"); 
		  }
	}
  

运行结果:

 4
java.lang.ArrayIndexOutOfBoundsException: 4
 at cn.netjava.lesson11.MyTest.main(MyTest.java:12)
出现异常!

 

2.使用throws ,throw

  throws将异常抛出,将异常交给Java虚拟机做,程序员不在需要自己对异常进行处理。使用格式为:throws 异常类型1,异常类型2......

  throw可用来自定义一个异常对象。 使用格式为:throw 异常对象

public static void main(String[] args) throws Exception 
	{ 
	  MyTest mt = new MyTest(); 
	  mt.creatfile() ;
	 }

    

 

 

 

 

 
public void creatfile() throws Exception{
		String str = "文件abc.txt";
		File file = new File(str);
		if (file.exists()) {
			long length = file.length();
			System.out.println("文件的长度是:" + length);
		} else {
				// 创建文件
				file.createNewFile();
				long length = file.length();
				System.out.println("文件创建成功!");
				System.out.println("文件的长度是:" + length+"byte");
		}
	}
	
 

 运行的结果:

文件创建成功!
文件的长度是:0byte

 

自定义异常

 
public class MyException extends Exception {

	public MyException(String message) {
		super(message);
	}
}
 

 

 
public static void main(String[] args) throws MyException {
		int i = 1 ;
		if(i == 0){
			throw new MyException("出现异常");
		}else {
			i-- ;
		}
	}
 

 

用throws声明方法可能抛出自定义的异常,并用throw语句在适当的地方抛出自定义的异常。

throw语句后不允许有紧跟其他语句,因为这些没有机会执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值