异常,这些类以 Throwable 为顶层父类。
Throwable 又派生出 Error 类和 Exception 类。
错误:Error 类以及他的子类的实例,代表了 JVM 本身的错误。错误不能被程序员通过代码处理,Error 很少出现。因此,程序员应该关注 Exception 为父类的分支下的各种异常类。
异常:Exception 以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被 Java 异常处理机制使用,是异常处理的核心。
编译时异常必须显示处理,运行时异常交给虚拟机。 运行时异常可以不处理。当出现这样的异常时,总是由虚拟机接管。比如我们从来没有人去处理过 Null Pointer Exception 异常,它就是运行时异常,并且这种异常还是最常见的异常之一。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由 Thread.run () 抛出,如果是单线程就被 main () 抛出(此时main方法需要在方法签名中throws异常的种类)。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,整个程序也就退出了。运行时异常是 Exception 的子类,也有一般异常的特点,是可以被 Catch 块处理的。只不过往往不对它处理罢了。也就是说,如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
异常:表示程序运行过程中可能出现的非正常状态。 运行时异常:表示虚拟机的通常操作中可能遇到的异常,是一种常见的运行错误。---------Java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出被捕获的运行时异常。
错误:Error 类以及他的子类的实例,代表了 JVM 本身的错误。错误不能被程序员通过代码处理,Error 很少出现。因此,程序员应该关注 Exception 为父类的分支下的各种异常类。
异常:Exception 以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被 Java 异常处理机制使用,是异常处理的核心。
IllegalArgumentException不合法的参数异常
一个简单的小例子:
package Test2; import java.text.SimpleDateFormat; import java.util.Date; public class Test3 { public static void main(String[] args) { Date day = new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date = df.format(day); SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM"); String format = dateFormat.format(date); System.out.println(format); } }运行会报错: 无法将给定的对象作为日期格式化,即因为传递了一个错误的参数。
Exception in thread "main" java.lang.IllegalArgumentException: Cannot format given Object as a Date at java.text.DateFormat.format(DateFormat.java:281) at java.text.Format.format(Format.java:140) at Test2.Test3.main(Test3.java:14)(1)异常处理的两种方式
自己处理向上抛,交给调用者处理。(2)具体的处理方式的选择原则
自己明确的知道如何处理,就要处理掉。不知道如何处理,就交给调用者处理。 注:异常, 不能捕获了之后什么也不做。或者只是使⽤e.printStacktrac异常机制: 有这么一个原则,如果在catch中遇到return或者异常等能使函数终止的事件,那么有finally就必须先执行完finally代码块里边的代码然后再返回catch/try中的返回值 分析: 代码走到第3行的时候会遇到一个MathException,这时第四行的代码就不会执行了,代码直接跳转到catch语句中,走到第6行的时候(异常机制),因此代码又跳到第8行,可惜第8行是一个return语句,那么这个时候方法就结束了,因此第6行的返回结果就无法被真正返回。(如果finally仅仅是处理了一个释放资源的操作,那么该道题最终返回的结果就是2。)因此上面返回值是3
1 public int getNum(){ 2 try { 3 int i=1/0; 4 return 1; 5 }catch (Exception e){ 6 return 2; 7 }finally { 8 return 3; 9 } 10 }1、throws出现在方法函数头;而throw出现在函数体。 2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。 3、两者处理异常的方式,均是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
答:不一定,分情况。
因为首先想要执行 finally 块的前提是必须执行到了 try 块,当在 try 块或者 catch 块中有 System.exit(0); 这样的语句存在时 finally 块就不会被执行到了,因为程序被结束了。此外当在 try 块或者 catch 块里 return 时 finally 会被执行;而且 finally 块里 return 语句会把 try 块或者 catch 块里的 return 语句效果给覆盖掉且吞掉了异常。 static void f3(){ try { int i=10/0; System.out.println("try"); } catch (Exception e){ System.out.println("catch"); System.exit(1); } finally { System.out.println("finally"); } }不要在 fianlly 中使用 return。 不要在 finally 中抛出异常。 减轻 finally 的任务,不要在 finally 中做一些其它的事情,finally 块仅仅用来释放资源是最合适的。 将尽量将所有的 return 写在函数的最后面,而不是 try … catch … finally 中。