1.
java中throw和throws:throw用在方法内部实际抛出异常的时候;throws用在方法头部(参数后面,方法体前面)。
public class Test{ public static void main(String[] args) { try { f(); } catch(NoSuchMethodException e) { System.out.println("test2"); } //用try…catch捕获并处理之后,后面的语句可以正常执行 System.out.println("test3"); } static void f() throws NoSuchMethodException { throw new NoSuchMethodException(); //在抛出异常之后,执行中断,代码块后面代码不再执行,代码块外面的可以执行如果后面还有代码编译期会报错,类似return //System.out.println("test1"); } }
2.
一个java文件中最多一个public类(可以没有public类),当然内部类可以有多个public类。main方法不能去掉public。
3.
java.lang.Throwable直接已知子类: Error, Exception ;Exception包含子类RuntimeException。
Error和RuntimeException,可以不用try…catch处理或声明抛出(当然捕获或者声明抛出也没问题);非RuntimeException的Exception必须在编译前用try…catch捕获处理或声明抛出,否则编译报错。
编译报错和Error是两回事。编译报错:代码语法不正确,就可能报错,处于编译期。例如少个分号,控制台“Test.java:6: 错误: 需要‘;‘” Error:运行期出现,不捕获或者不声明抛出,编译都可以通过,但是运行的时候会报java.lang.Error类型异常。
Error用于指示合理的应用程序不应该试图捕获的严重问题。
RuntimeException——意味着程序存在bug,如数组越界,0被除,入参不满足规范.....这类异常需要更改程序来避免(当然也可以捕获处理,但是一般都是程序有问题,不应该通过捕获来“隐藏”程序bug)。
4.
Exception:表示一个由程序员导致的错误(非RuntimeException的Exception必须用捕获或抛给上级处理,RuntimeException一般都是编程有bug)。应该在应用程序级被处理。
Error:经常用来用于表示系统错误或低层资源的错误。如何可能的话,应该在系统级被捕捉。
5.
总结:非RuntimeException的Exception要捕获处理或者声明抛出被调用者处理,要么编译都通不过;RuntimeException要尽可能的避免(属于程序bug),编译的时候检查不到。
java异常详解