自定义异常
  1. checked异常
  自定义异常类InvalidUrlException
public class InvalidUrlException extends Exception {
public InvalidUrlException(String s){
super(s);
}
}
public class Main {
public static void getRemoteData(String url) throws InvalidUrlException{
if(isValidUrl(url)){
//获取远程数据
}
else
throw new InvalidUrlException("Invalid URL: " + url);
}
public static boolean isValidUrl(String url){
.... //验证URL是否有效
}
public static void main(String[] args) {
getRemoteData(args[0]);
}
}
  如果在main方法里调用getRemoteData,有两种做法,一种是try-catch,另一种则是直接给main加上throws InvalidUrlException。
  2. unchecked异常
  如果将InvalidUrlException改成extends RuntimeException,
  public class InvalidUrlException extends Exception {
  public InvalidUrlException(String s){
  super(s);
  }
  }
  那么main不需要再加throws或者try-catch。
  选择checked还是unchecked异常?
  一些Java书籍建议使用checked异常处理程序中所有可恢复的异常,而用unchecked异常作为无法恢复的错误。但是实际上那些继承自RuntimeException的Java异常大多也可以在程序中恢复的,比如NullPointerException、IllegalArgumentExceptions、除0异常等等都可以通过捕获处理使程序继续运行。只有一些特殊情况会破坏程序的执行,比如启动的时候读取配置文件,如果配置文件不存在或者有严重错误,程序只好退出。
  以下是是支持和反对checked异常的一些观点:
  编译器强制捕获或者抛出unchecked异常使开发人员时刻记着要处理异常。
  抛出checked异常的方法必须声明throws,throws成为了方法或者接口的一部分,给后续版本增加或者修改方法的异常带来不便。
  unchecked异常不需要显式地处理反而使异常处理变的困难。
  调用checked异常的方法,必须处理这个方法的异常,这使得上层的调用者代码混乱。
  选择checked还是unchecked都是由你自己决定的,很难说哪种一定正确,反之一定错误。目前比较流行的语言中,Java似乎是支持checked异常的语言,其他语言都只有unchecked异常。