Java语言异常处理

1.Java的程序错误处理机制

1.什么是异常

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。

异常发生的原因有很多,通常包含以下几大类:
1.用户输入了非法数据。
2.要打开的文件不存在。
3.网络通信时连接中断,或者JVM内存溢出。
这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。

要理解Java异常处理是如何工作的,需要掌握以下三种类型的异常:
1.检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
2.运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
3.错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

2.Java程序错误处理机制概述

第一种处理方法由计算机系统本身直接检测程序错误,遇到错误时使程序终止运行优点是使程序设计比较简单,但是,对程序错误一概采用终止运行办法,显然过于简单化。因为有些情况下,完全可以通过其他途径保持程序继续运行。比如:由于文件名不符合要求而无法打开文件,那么,可以提示用户输入一个新的文件名,从而使程序继续往下运行。
第二种处理方法由程序员在程序设计中考虑到错误检测,错误信息显示和出错处理优点是减少了中途终止程序运行的可能性。但是,要求程序员在程序设计过程中不仅将精力用于正常处理,还要精心考虑错误检测和处理,这会使程序变得复杂。并且,这类错误检测往往在多数程序中重复,甚至在一个程序中多次重复。而另一方面,如果程序中某处忽略了应有的检测,又将引起程序总体结果的错误。
采用异常处理机制来处理程序运行中的错误。按照这种机制,将程序运行中的所有错误都看成是一种异常,通过对语句块的检测,一个程序中所有的异常被收集起来放在程序的某一段中处理。在Java系统中,专门设置了一个调用栈,此栈中装有指向异常处理方法的指针。在程序运行时,系统会把收集到的异常和异常处理指针所指的处理类型逐个比较,如果找到相符的类型,那么就转向相应的方法处理,如果没有在调用栈中找到相应的类型指针,则终止程序运行,并显示解释信息。

2.Throwable类

链接: java.lang包中Throwable类的用法
下面的列表是 Throwable 类的主要方法:
请添加图片描述

1.异常产生的原因

在 Java 程序中,异常一般由两种原因引起。
一种是程序中存在非法操作,最简单的例子就是除数为零的除法操作。这种原因常常是程序员出于无意或粗心大意而造成的,所以称为隐式异常。常见的隐式异常可以通过 java. lang 包中的 Throwable 的子类Error来处理。
另一种是程序员在程序中使用了 throw语句引起的异常。这种异常是程序员出于某种考虑有意安排的,所以称为显式异常。在 throw 语句中,都会指出处理显式异常的对象,这些对象都是由 java. lang 包中的 Throwable 的子类 Exception 派生的子类生成的,每个对象完成对某种异常的处理功能,这些对象综合起来实现各种异常处理。
显式异常有时对于程序处理会带来一定的方便性,因为它可以受编程人员控制。这样,我们可以将程序中某些特殊情形通过异常方式表达出来,从而可以通过外界的异常处理程序专门来处理这些特殊情形。
请添加图片描述

2.Error类

Error类包括的是一些严重的系统错误类。比如虚拟机错误,内存溢出,程序死锁等。对于这类所产生的异常主要与硬件有关,而不是由程序本省抛出,JAVA允许不对其进行处理。处理过程由系统自己完成。

3.Exception类

Exception类包括的是runtimeException,数据格式异常类,内存溢出类,中断异常类等。除RuntimeException类外,对于Exception类的其他子类所产生的异常对象,系统要求必须对他们进行处理,比如:声明,抛出,捕获等

3.异常处理

catch 不能独立于 try 存在。
在 try/catch 后面添加 finally 块并非强制性要求的。
try 代码后不能既没 catch 块也没 finally 块。
try, catch, finally 块之间不能添加任何代码。

1.捕获异常

使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。
try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下:

try
{
   // 程序代码
}catch(ExceptionName e1)
{
   //Catch 块
}

Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。
如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。

import java.io.*;
public class ExcepTest{
 
   public static void main(String args[]){
      try{
         int a[] = new int[2];
         System.out.println("Access element three :" + a[3]);
      }catch(ArrayIndexOutOfBoundsException e){
         System.out.println("Exception thrown  :" + e);
      }
      System.out.println("Out of the block");
   }
}

请添加图片描述

2.多重捕获块

一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。
多重捕获块的语法如下所示:

try{
   // 程序代码
}catch(异常类型1 异常的变量名1){
  // 程序代码
}catch(异常类型2 异常的变量名2){
  // 程序代码
}catch(异常类型3 异常的变量名3){
  // 程序代码
}

上面的代码段包含了 3 个 catch块。可以在 try 语句后面添加任意数量的 catch 块。如果保护代码中发生异常,异常被抛给第一个 catch 块。如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。如果不匹配,它会被传递给第二个 catch 块。如此,直到异常被捕获或者通过所有的 catch 块。

import java.lang.*;
public class ExcepTest{
   public static void main(String args[]){
    	String name=null;
	try{
		if(name.equals("你好"))
			System.out.println("我的名字叫:"+name);
	}catch(ArithmeticException e){
		System.out.println("1");
	}catch(NullPointerException e){
		System.out.println("2");
	}
     }
}

请添加图片描述

3.finally关键字

finally 关键字用来创建在 try 代码块后面执行的代码块。无论是否发生异常,finally 代码块中的代码总会被执行。在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。finally 代码块出现在 catch 代码块最后,语法如下:

try{
  // 程序代码
}catch(异常类型1 异常的变量名1){
  // 程序代码
}catch(异常类型2 异常的变量名2){
  // 程序代码
}finally{
  // 程序代码
}

4.抛出异常

1.throws/throw 关键字:

如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。
也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。
throw : 将产生的异常抛出(强调的是动作),抛出的既可以是异常的引用,也可以是异常对象。(位置: 方法体内)
throws : 如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常。用它修饰的方法向调用者表明该方法可能会抛出异常(可以是一种类型,也可以是多种类型,用逗号隔开)(位置: 写在方法名 或方法名列表之后 ,在方法体之前。)

package lab;

import java.lang.*;
import java.sql.SQLOutput;

public class lab01 {
   void run() throws IllegalAccessException{
       throw new IllegalAccessException();
   }
    public static void main(String[] args) {
     lab01 tte=new lab01();
     try{
         tte.run();
     }catch(Exception e){
         System.out.println("我们捕获了一个异常:"+e);
     }

    }
}

请添加图片描述

5.自定义异常

在 Java 中你可以自定义异常。编写自己的异常类时需要记住下面的几点。
所有异常都必须是 Throwable 的子类。
如果希望写一个检查性异常类,则需要继承 Exception 类。
如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。

可以像下面这样定义自己的异常类:

class MyException extends Exception{
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值