欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

因为下面的finally中使用了return); }finally { return 100; } } //try中的异

点击: 次  来源:宝鼎软件 时间:2017-09-16

原文出处: 代码钢琴家

简介

措施运行时,产生的不被期望的事件,它阻止了措施凭据措施员的预期正常执行,这就是异常。异常产生时,是任措施自生自灭,立即退出终止,照旧输堕落误给用户?可能用C语言气势气魄:用函数返回值作为执行状态?。

Java提供了越发优秀的办理步伐:异常处理惩罚机制。

异常处理惩罚机制能让措施在异常产生时,凭据代码的预先设定的异常处理惩罚逻辑,针对性地处理惩罚异常,让措施尽最大大概规复正常并继承执行,且保持代码的清晰。
Java中的异常可以是函数中的语句执行时激发的,也可以是措施员通过throw 语句手动抛出的,只要在Java措施中发生了异常,就会用一个对应范例的异常工具来封装异常,JRE就会试图寻找异常处理惩罚措施来处理惩罚异常。

Throwable类是Java异常范例的顶层父类,一个工具只有是 Throwable 类的(直接可能间接)实例,他才是一个异常工具,才气被异常处理惩罚机制识别。JDK中内建了一些常用的异常类,我们也可以自界说异常。

Java异常的分类和类布局图

Java尺度裤内建了一些通用的异常,这些类以Throwable为顶层父类。

Throwable又派生出Error类和Exception类。

错误:Error类以及他的子类的实例,代表了JVM自己的错误。错误不能被措施员通过代码处理惩罚,Error很少呈现。因此,措施员应该存眷Exception为父类的分支下的各类异常类。

异常:Exception以及他的子类,代表措施运行时发送的各类不期望产生的事件。可以被Java异常处理惩罚机制利用,是异常处理惩罚的焦点。

因为下面的finally中利用了return); }finally { return 100; } } //try中的异常被抑制 @SuppressWarnings(finally) public static int bar() throws Exception { try { int a = 5/0; return 1; }finally { return 100; } }} finally中的异常会包围(没落)前面try可能catch中的异常 class TestException{ public s 昆山软件开拓 tatic void main(String[] args) { int result; try{ result = foo(); } catch (Exception e){ System.out.println(e.getMessage()); //输出:我是finaly中的Exception } try{ result = bar(); } catch (Exception e){ System.out.println(e.getMessage()); //输出:我是finaly中的Exception } } //catch中的异常被抑制 @SuppressWarnings(finally) public static int foo() throws Exception { try { int a = 5/0; return 1; }catch(ArithmeticException amExp) { throw new Exception(我将被忽略

总体上我们按照Javac对异常的处理惩罚要求,将异常类分为2类。

非查抄异常(unckecked exception):Error 和 RuntimeException 以及他们的子类。javac在编译时,不会提示和发明这样的异常,不要求在措施处理惩罚这些异常。所以假如愿意,我们可以编写代码处理惩罚(利用try…catch…finally)这样的异常,也可以不处理惩罚。对付这些异常,我们应该批改代码,而不是去通过异常处理惩罚器处理惩罚 。这样的异常产生的原因多数是代码写的有问题。如除0错误ArithmeticException,错误的强制范例转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,利用了空工具NullPointerException等等。

查抄异常(checked exception):除了Error 和 RuntimeException的其它异常。javac强制要求措施员为这样的异常做预备处理惩罚事情(利用try…catch…finally可能throws)。在要领中要么用try-catch语句捕捉它并处理惩罚,要么用throws子句声明抛出它,不然编译不会通过。这样的异常一般是由措施的运行情况导致的。因为措施大概被运行在各类未知的情况下,而措施员无法过问用户如何利用他编写的措施,于是措施员就应该为这样的异常时刻筹备着。如SQLException , IOException,ClassNotFoundException 等。

需要明晰的是:查抄和非查抄是对付javac来说的,这样就很好领略和区分了。

初识异常

下面的代码会演示2个异常范例:ArithmeticException 和 InputMismatchException。前者由于整数除0激发,后者是输入的数据不能被转换为int范例激发。

package com.example;
import java. util .Scanner ;
public class AllDemo
{
      public static void main (String [] args )
      {
            System . out. println( "----接待利用呼吁行除法计较器----" ) ;
            CMDCalculate ();
      }
      public static void CMDCalculate ()
      {
            Scanner scan = new Scanner ( System. in );
            int num1 = scan .nextInt () ;
            int num2 = scan .nextInt () ;
            int result = devide (num1 , num2 ) ;
            System . out. println( "result:" + result) ;
            scan .close () ;
      }
      public static int devide (int num1, int num2 ){
            return num1 / num2 ;
      }
}
/*****************************************

----接待利用呼吁行除法计较器----
0
Exception in thread "main" java.lang.ArithmeticException : / by zero
     at com.example.AllDemo.devide( AllDemo.java:30 )
     at com.example.AllDemo.CMDCalculate( AllDemo.java:22 )
     at com.example.AllDemo.main( AllDemo.java:12 )

----接待利用呼吁行除法计较器----
r
Exception in thread "main" java.util.InputMismatchException
     at java.util.Scanner.throwFor( Scanner.java:864 )
     at java.util.Scanner.next( Scanner.java:1485 )
     at java.util.Scanner.nextInt( Scanner.java:2117 )
     at java.util.Scanner.nextInt( Scanner.java:2076 )
     at com.example.AllDemo.CMDCalculate( AllDemo.java:20 )
     at com.example.AllDemo.main( AllDemo.java:12 )
*****************************************/