关于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
2
使用 try catch finally 语句块进行捕获
在产生异常的方法所在的方法声明 throws  Exception

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

 

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

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

1
throw 语法: throw  <异常对象> 

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

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

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

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

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

 

7.自定义异常

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

创建自定义异常:

1
2
3
4
5
6
7
8
public  class  MyException  extends  Exception{
     public  MyException(){
         super ();
     }
     public  MyException(String msg){
         super (msg);
     }
}

在类中使用异常:

1
2
3
4
5
6
7
8
9
public  class  ExceptionTest {
 
     public  static  void  execute(String a)  throws  MyException {
         System.out.println( "execute..." );
         if ( "true" .equals(a)){
             throw  new  MyException( "参数不能为 true" );
         }
     }
} 

捕获自定义异常:

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

自定义异常的一般过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
自定义异常:
class  异常类名  extends  Exception
{
     public  异常类名(String msg)
     {
         super (msg);
     }
  
标识可能抛出的异常:
throws  异常类名 1 ,异常类名 2
  
捕获异常:
try {}
catch (异常类名 y){}
catch (异常类名 y){}
  
方法解释
getMessage()  //输出异常的信息
printStackTrace()  //输出导致异常更为详细的信息


8.常见的异常类

算术异常类:ArithmeticExecption

空指针异常类:NullPointerException

类型强制转换异常: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.下面的代码都有哪些错误:

1
2
3
4
5
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异常代码有什么错误:

1
2
3
4
5
6
7
8
9
10
11
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可以用来捕捉所有运行时异常,这样就不需要声明抛出语句。

 


本文转自邴越博客园博客,原文链接:http://www.cnblogs.com/binyue/p/3456888.html,如需转载请自行联系原作者

相关文章
|
12月前
|
Java 程序员 数据库连接
我们详细地讲解一下 Java 异常及要如何处理
我是小假 期待与你的下一次相遇 ~
269 1
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
SQL Java 中间件
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
824 14
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
4975 5
|
Java API 调度
如何避免 Java 中的 TimeoutException 异常
在Java中,`TimeoutException`通常发生在执行操作超过预设时间时。要避免此异常,可以优化代码逻辑,减少不必要的等待;合理设置超时时间,确保其足够完成正常操作;使用异步处理或线程池管理任务,提高程序响应性。
660 13
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
527 1
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
323 1
|
IDE 前端开发 Java
怎样避免 Java 中的 NoSuchFieldError 异常
在Java中避免NoSuchFieldError异常的关键在于确保类路径下没有不同版本的类文件冲突,避免反射时使用不存在的字段,以及确保所有依赖库版本兼容。编译和运行时使用的类版本应保持一致。
705 8
|
Java 编译器
如何避免在 Java 中出现 NoSuchElementException 异常
在Java中,`NoSuchElementException`通常发生在使用迭代器、枚举或流等遍历集合时,尝试访问不存在的元素。为了避免该异常,可以在访问前检查是否有下一个元素(如使用`hasNext()`方法),或者使用`Optional`类处理可能为空的情况。正确管理集合边界和条件判断是关键。
443 6