一、基本概念
当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,JAVA就会用异常对象来描述。java中用2种方法处理异常:
在发生异常的地方直接处理。
将异常抛给调用者,让调用者处理。
二、异常分类
1、检查性异常(java.lang.Exception)
程序正确,但因为外在的环境条件不满足引发。例如:用户错误及I/O问题--程序试图打开一个并不存在的远程Socket端口,或者是打开不存在的文件时。这不是程序本身的逻辑错误,而很可能是远程机器名字错误(用户拼写错误),对商用软件系统,程序开发者必须考虑并处理这个问题。java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。
2、运行期异常(java.lang.RuntimeException)
这意味着程序存在bug,如数组越界、0被除、入参不满足规范...这类异常需要更改程序来避免,java编译器强制要求处理这类异常。
3、错误(java.lang.Error)
一般很少见,也很难通过程序解决,它可能源于程序的bug,但一般更可能源于环境问题,如内存耗尽。错误在程序中无需处理,而由运行环境处理。
注意:顶层是java.lang.Throwable类,检查性异常、运行期异常、错误都是这个类的子孙类,java.lang.Exception和java.lang.Error继承自java.lang.Throwable,而java.lang.RuntimeException继承自java.lang.Exception
在其下面常见的异常有:
ArithmeticException:数学计算异常
InputMismatchException:输入格式不匹配
ArrayIndexOutOfBoundsException:数组越界异常
NullPointerException:空指针异常,引用型数据还未初始化值就被调用了
ClassNotFoundException:加载其他项目或jar包中的类时,找不到该类
三、异常处理
1、自己处理
1.try...catch
程序运行产生异常时,将从异常发生点中断程序并向外抛出异常信息。
int x=(int)(Math.random()*5); int y=(int)(Math.random()*10); int[] z=new int[5]; try{ System.out.println("y/x="+(y/x)); System.out.println("y="+y+"z[y]="+z[y]); } catch(ArithmeticException exc1){//分步捕获算术运算异常信息 System.out.println("算术运算异常:"+exc1.getMessage()); } catch(ArrayIndexOutOfBoundsException exc2){//分步捕获数据越界异常信息 System.out.println("数据越界异常:"+exc2.getMessage()); }
2.finally
如果把finally块置try...catch...语句后,finally块一般都会得到执行,它相当于一个万能的保险,即使前面的try块发生异常,而又没有对应异常的catch块,finally块将马上执行。
public class Demo148 { public static void main(String[] args) { FileReader fr=null; //检查异常 //1、打开不存在的文件 //FileReader fr=new FileReader("d:\\aa.txt"); try {//使用try{}catch(Exception e){}将可能出错的程序放入到里面,当出错时会有相应提示,便于解决bug //在出现异常的地方就终止执行代码,然后直接进入到catch语句 fr=new FileReader("d:\\aa.txt"); //System.exit(-1);//使用System.exit()后finally语句块不再执行 Socket s=new Socket("192.168.1.1",21); } catch (FileNotFoundException e) {//catch(Exception e)捕获所有错误信息,为了方便一般使用此方法来捕获所有错误信息 // 把异常的信息输出,利于排除bug //e.getMessage(); System.out.println("文件不存在:"+e.getMessage());//.getMessage()不如.printStackTrace() //e.printStackTrace();//输出bug信息 //处理 } catch (IOException e2){//UnknownHostException e2.printStackTrace(); } finally { //try..catch..语句块中不管出没出现异常,一般都会执行finally语句块 //一般说,把需要关闭的资源。如[文件]、[链接]、[内存]... System.out.println("测试进入finally语句块"); if(fr!=null){ try { fr.close(); } catch (Exception e) { e.printStackTrace(); } } } System.out.println("OK1");
以下情形,finally块将不会被执行:
finally块中发生了异常
程序所在的线程死亡
在前面的代码中用了System.exit()
关闭CPU
2、抛给调用者
将异常抛给调用者,让调用者处理异常
1.thorws
是在方法声明时,告诉调用该方法的对象,该方法可能会出现的异常(被动,不负责任)。
public class Demo { public static void main(String[] args) { Father father=new Father(); father.test1(); } } class Father{ private Son son=null; public Father(){ son=new Son(); } public void test1(){ System.out.println("1"); try { son.test2(); } catch (Exception e) { System.out.println("Father在处理Son的异常"); e.printStackTrace(); } } } class Son{ public void test2() throws Exception{//throws Exception抛出程序块的异常,由调用者解决异常 FileReader fr=null; fr=new FileReader("d:\\aaa.txt"); } }
2.throw
在程序运行过程中,可以预知异常(主动处理)
public static void main(String[] args){ try{ int a=10; int b=0; if(b==0){ throw new Exception("除数不能为零"); //在异常中打印出这句话 } int c=a/b; System.out.println("异常之后");//不执行 }catch(Exception e){ e.printStackTrace();//在异常中打印出那句话 } }
3、多个异常的处理规则
定义多个catch可精确地定位异常。如果为子类的异常定义了特殊的catch块,而父类的异常则放在另外一个catch块中,此时,必需满足以下规则:
子类异常的处理块必需在父类异常处理块的前面,否则会发生编译错误。所以越特殊的异常越在前面处理,越普通的异常越在后面处理。这类似于制订防火墙的规则次序:较特殊的规则在前,较普通的规则在后。
四、自定义异常
自己也可以定义并抛出异常,方法是2步:
创建异常,抛出异常(首先实例化一个异常对象,然后用throw抛出)合在一起就是---throw new IOException("异常说明信息"),将创建异常,抛出异常合在一起的好处是:创建异常时,会包含异常创建处的行信息,异常被捕获时可以通过堆栈迹(Stack Trace)的形式报告这些信息。如果在同一行代码创建和抛出异常时,对于程序的调试将非常有用。所以,throw new XXX()已经成为一个标准的异常抛出范式。在定义一个方法时,方法块中调用的方法可能会抛出异常,可用上面的throw new XXX()处理,如果不处理,那么必需在方法定义时,用throws声明这个方法全抛出的异常。
对异常的处理,有一条行之有效的默认规则:向上抛出----被调用类在运行过程中对遇到的异常一概不作处理,而是直接向上抛出,一直到最上层的调用类,调用类根据应用系统的需求和特定的异常处理规则进行处理,如向控制台输出异常堆栈信息,打印在日志文件中。用一句形象的话来说,就是谁使用,谁(最上层的调用类)处理。
举例:
首先自定义异常类:
public class PasswordException extends Exception{ public PasswordException(String info){ super(info); } }
然后在类中:
public class Main { public static void main(String[] args) { String s="1234567"; try { if(s.length()!=6){ throw new PasswordException("密码长度须6位"); } } catch (PasswordException e) {//处理自定义的异常 System.out.println(e); } System.out.println("over"); } }
The above is the detailed content of Several exception handling methods in daily Java development. For more information, please follow other related articles on the PHP Chinese website!

在Java开发过程中,异常处理一直是一个十分重要的话题。当代码发生异常时,程序往往需要通过异常处理来捕获和处理异常,从而保证程序的稳定性和安全性。其中一个常见的异常类型就是AssertionError异常。本文将介绍AssertionError异常的意义和用法,帮助读者更好地理解和应用Java异常处理。一、AssertionError异常的意义Asserti

Java中的ClassNotFoundException异常是开发中的常见问题之一。在Java的开发中,通过类名来获取类的实例是一种非常常见的做法,但是如果找不到要加载的类,就会抛出ClassNotFoundException异常。那么,ClassNotFoundException异常的常见原因是什么呢?类路径不正确在Java中,当需要加载某个类的时候,JV

Java是目前世界上使用最广泛的编程语言之一,而在Java编程过程中,异常处理是非常重要的一环。本文将会介绍Java中的NoSuchFieldException异常,它是如何产生的以及如何处理它。一、NoSuchFieldException异常的定义NoSuchFieldException是Java中的一种Checked异常,表示在没有发现指定的字段时抛出的

Java是一种流行的高级编程语言,它使得开发人员能够轻松地创建各种应用程序。然而,正如其他任何编程语言一样,Java在编码过程中可能出现一些错误和异常。其中一个常见的异常是NoSuchFieldError。本文将介绍这种异常的原因、如何避免它以及如何处理它。NoSuchFieldError异常是什么?先来了解NoSuchFieldError异常。简单

异步和非阻塞技术可用于补充传统异常处理,允许创建更具响应性和高效的Java应用程序:异步异常处理:在另一个线程或进程中处理异常,允许主线程继续执行,避免阻塞。非阻塞异常处理:涉及在I/O操作出错时事件驱动的异常处理,避免阻塞线程,由事件循环处理异常。

Java异常处理的局限性包括:无法捕捉虚拟机和操作系统异常。异常处理可能掩盖更深层次的问题。嵌套异常难以调试。异常处理代码降低可读性。运行时检查异常会产生性能开销。

Java中的NoSuchFieldException异常指的是在反射过程中试图访问不存在的字段(Field)时抛出的异常。在Java中,反射可以让我们通过代码来操纵程序中的类、方法、变量等,使得程序具有更高的灵活性和扩展性。但是,在使用反射时,如果访问的字段不存在,则会抛出NoSuchFieldException异常。NoSuchFieldException

Java中的StringIndexOutOfBoundsException异常是指当字符串中的索引超出了有效范围时所引发的异常。例如,当我们访问一个字符串中超出其长度范围的字符或子字符串时,就会触发该异常。在Java编程中,这类异常是非常常见的,因此,我们需要知道如何处理StringIndexOutOfBoundsException异常,以避免程序出错。一、


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool

SublimeText3 Mac version
God-level code editing software (SublimeText3)

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

Notepad++7.3.1
Easy-to-use and free code editor

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.
