zoukankan      html  css  js  c++  java
  • 关于Java异常和错误的几个问题

    1.Java中什么是Exception?

    异常是Java传达给你的系统和程序错误的方式。

    在java中,异常功能是通过实现比如Throwable,Exception,RuntimeException之类的类,然后还有一些处理异常时候的关键字,比如throw,throws,try,catch,finally之类的。

     所有的异常都是通过Throwable衍生出来的。

    Throwable把错误进一步划分为 java.lang.Exception 和 java.lang.Error。

    java.lang.Error 用来处理系统错误,例如java.lang.StackOverFlowError 或者 Java.lang.OutOfMemoryError 之类的。

    然后 Exception用来处理程序错误,请求的资源不可用等等。

    2.Java的异常体系

    在Java中异常Exception和错误Error有个共同的父类Throwable。

    3. 异常和错误的区别

    错误:常见的有程序进入死循环,内存泄漏等。这种情况,程序运行时本身无法解决,只能通过其他方法干预。对应的类为Error类

    异常:常见的有除数为0,数组越界等。这种情况,不向错误那样,程序运行时本身可以解决,由异常代码调整程序运行方向,使程序仍可继续运行直至正常结束。对应的类为Exception类。

    抛出异常:当程序发生异常时,产生一个异常事件,生成一个异常对象,并把它提交给运行系统,再由运行系统寻找相应的代码来处理异常,这个过程称为抛出异常。

    捕获异常:异常抛出后,运行时系统从生成对象的代码开始,沿方法的调用栈逐层回溯查找,直到找到包含相应处理的方法,并把异常对象交给该方法为止,这个过程称为捕获异常。

    4.运行时异常和非运行时异常

     非运行时异常(Checked Exception)

    Java中凡是继承自Exception但不是继承自RuntimeException的类都是非运行时异常

    运行时异常(Runtime Exception/Unchecked Exception)

    RuntimeException类直接继承自Exception类,称为运行时异常。Java中所有的运行时异常都直接或间接的继承自RuntimeException.

    5.异常处理的一般原则 

    对应非运行时异常,必须对其进行处理。

    处理方式有两种:

    1使用trycatchfinally语句块进行捕获

    2在产生异常的方法所在的方法声明throws Exception

    对于运行时异常,可以不对其进行处理,也可以对其进行处理,一般情况下都不对其进行处理。

     

    6.throw 和 throws这两个关键字在java中有什么不同?

    区别一:throw 是语句抛出一个异常;throws 是方法抛出一个异常;

    throw语法:throw <异常对象> 

    在方法声明中,添加throws子句表示该方法将抛出异常。

    throws语法:[<修饰符>]<返回值类型><方法名>([<参数列表>])[throws<异常类>]

    其中:异常类可以声明多个,用逗号分割。

    区别二:throws可以单独使用,但throw不能;

    区别三:throw要么和try-catch-finally语句配套使用,要么与throws配套使用。但throws可以单独使用,然后再由处理异常的方法捕获。

    7.自定义异常

    自定义异常通常是定义一个继承自Exception类的子类。一般情况下我们都会直接继承自Exception类,而不会继承某个运行时的异常类。

    创建自定义异常:

    public class MyException extends Exception{
        public MyException(){
            super();
        }
        public MyException(String msg){
            super(msg);
        }
    }

    在类中使用异常:

    public class ExceptionTest {
     
        public static void execute(String a) throws MyException {
            System.out.println("execute...");
            if("true".equals(a)){
                throw new MyException("参数不能为 true");
            }
        }
    } 

    捕获自定义异常:

    public static void main(String[] args) throws MyException {
        execute("true");
    }

    自定义异常的一般过程:

    自定义异常:
    class 异常类名 extends Exception
    {
        public 异常类名(String msg)
        {
            super(msg);
        }
    } 
      
    标识可能抛出的异常:
    throws 异常类名1,异常类名2
      
    捕获异常:
    try{}
    catch(异常类名 y){}
    catch(异常类名 y){}
      
    方法解释
    getMessage() //输出异常的信息
    printStackTrace() //输出导致异常更为详细的信息

    8.常见的异常类

    算术异常类:ArithmeticExecption  uncheckedExcepiton

    空指针异常类:NullPointerException  uncheckedExcepiton

    类型强制转换异常:ClassCastException 

    数组负下标异常:NegativeArrayException

    数组下标越界异常:ArrayIndexOutOfBoundsException

    违背安全原则异常:SecturityException

    文件已结束异常:EOFException

    文件未找到异常:FileNotFoundException

    字符串转换为数字异常:NumberFormatException

    操作数据库异常:SQLException

    输入输出异常:IOException

    方法未找到异常:NoSuchMethodException

    9.如果执行finally代码块之前方法返回了结果,或者JVM退出了,finally块中的代码还会执行吗?

    了解finally块是怎么执行的,即使是try里面已经使用了return返回结果的情况,对了解Java的异常处理都非常有价值。

    只有在try里面是有System.exit(0)来退出JVM的情况下finally块中的代码才不会执行。

    10.Java中final,finalize,finally关键字的区别

    final和finally是Java的关键字,而finalize则是方法。final关键字在创建不可变的类的时候非常有用,只是声明这个类是final的。

    而finalize()方法则是垃圾回收器在回收一个对象前调用,但也Java规范里面没有保证这个方法一定会被调用。

    11.下面的代码都有哪些错误:

    public class SuperClass {
            public void start() throws IOException{ 
              throw new IOException(“Not able to open file”);
           }   
    }
     
        public class SubClass extends SuperClass {
            public void start() throws Exception { 
               throw new Exception(“Not able to start”); 
          } 
    } 

    这段代码会在捕捉异常代码块的RuntimeException类型变量“re”里抛出编译异常错误。因为Exception是RuntimeException的父类,在start方法中所有的RuntimeException会被第一个捕捉异常块捕捉,

    这样就无法到达第二个捕捉块,这就是抛出“exception java.lang.RuntimeException has already been caught”的编译错误原因。

    这段代码编译器将对子类覆盖start方法产生不满。因为每个Java中方法的覆盖是有规则的,一个覆盖的方法不能抛出的异常比原方法继承关系高。因为这里的start方法在父类中抛出了IOException,所有在子类中的start方法只能抛出要么是IOExcepition或是其子类,但不能是其超类,如Exception。

    12.下面的Java异常代码有什么错误:

    public static void start(){
    System.out.println(“Java Exception interivew question Answers for Programmers”);
    }
    public static void main(String args[]) {
     try{
    start();
    }
    catch(IOException ioe){
     ioe.printStackTrace();
     }
    }

    上面的Java异常例子代码中,编译器将在处理IOException时报错,因为IOException是受检查异常,而start方法并没有抛出IOException,所以编译器将抛出“异常, java.io.IOException 不会在try语句体中抛出”,但是如果你将IOException改为Exception,编译器报错将消失,因为Exception可以用来捕捉所有运行时异常,这样就不需要声明抛出语句。

    Exception

    Exception则可使从任何标准Java库的类方法,自己的方法以及运行时任何异常中抛出来的基类型。

    异常可分为执行异常(RuntimeException)和检查异常(Checked Exceptions)两种

    RuntimeException

    RuntimeException在默认情况下会得到自动处理。所以通常用不着捕获RuntimeException,但在自己的封装里,也许仍然要选择抛出一部分RuntimeException。

    RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。可能在执行方法期间抛出但未被捕获的RuntimeException的任何子类都无需在throws子句中进行声明。(java api)

    它是uncheckedExcepiton。

    Java.lang.ArithmeticException

    Java.lang.ArrayStoreExcetpion

    Java.lang.ClassCastException

    Java.lang.EnumConstantNotPresentException

    Java.lang.IllegalArgumentException

    Java.lang.IllegalThreadStateException

    Java.lang.NumberFormatException

    Java.lang.IllegalMonitorStateException

    Java.lang.IllegalStateException

    Java.lang.IndexOutOfBoundsException

    Java.lang.ArrayIndexOutOfBoundsException

    Java.lang.StringIndexOutOfBoundsException

    Java.lang.NegativeArraySizeException’

    Java.lang.NullPointerException

    Java.lang.SecurityException

    Java.lang.TypeNotPresentException

    Java.lang.UnsupprotedOperationException

    CheckedException

    除了runtimeException以外的异常,都属于checkedException,它们都在java.lang库内部定义。Java编译器要求程序必须捕获或声明抛出这种异常。

    一个方法必须通过throws语句在方法的声明部分说明它可能抛出但并未捕获的所有checkedException。

    Java.lang.ClassNotFoundException

    Java.lang.CloneNotSupportedException

    Java.lang.IllegalAccessException

    Java.lang.InterruptedException

    Java.lang.NoSuchFieldException

    Java.lang.NoSuchMetodException

     

  • 相关阅读:
    扩充Visual Studio 功能
    如何分层啊?
    DirectXInput
    关于分享
    消息机制
    C# 开启一个新进程,IE,打开一个URL,第一次总失败,刷新一下就好了
    远程调试IIS服务器的ASP.NET2.0网站
    IIS 用户 NT AUTHORITY\NETWORK SERVICE 登录失败解决方法
    SharePoint 2010微软Technet讲座第一讲笔记(2011年3月9日发布)
    IIS 未能加载文件或程序集 system.web.extensions解决方法
  • 原文地址:https://www.cnblogs.com/jack-Star/p/8275356.html
Copyright © 2011-2022 走看看