zoukankan      html  css  js  c++  java
  • throws和throw抛出异常的使用规则

    一直对java中的throws和throw不太理解。最近一直在查这两个方面的资料,算是能明白一点吧。如果我下面的观点哪有不对,希望指出来,我加以改进。

        
       throw:(针对对象的做法)
       抛出一个异常,可以是系统定义的,也可以是自己定义的。下面举两个例子:
       
    抛出Java中的一个系统异常:
    public class One {
    public void yichang(){
    NumberFormatException e = new NumberFormatException();
    throw e;
    }
    public static void main(String[] args){
    One test = new One();
    try{
    test.yichang();
    }catch(NumberFormatException e){
    System.out.println(e.getMessage());
    }
    }
    }
     
    抛出一个自定义的异常:
     
    public class People {
     public static int check(String strage) throws MyException{
     int age = Integer.parseInt(strage);
     if(age < 0){
     throw new MyException("年龄不能为负数!");
     }
     return age;
     }
     public static void main(String[] args){
     try{
     int myage = check("-101");
     System.out.println(myage);
     }catch(NumberFormatException e){
     System.out.println("数据格式错误");
     System.out.println("原因:" + e.getMessage());
     }catch(MyException e){
     System.out.println("数据逻辑错误");
     System.out.println("原因:" + e.getMessage());
     }
     }
    }
    public class MyException extends Exception{
     private static final long serialVersionUID = 1L;
     private String name;
     public MyException(String name){
     this.name = name;
     }
     public String getMessage(){
     return this.name;
     }
    }
     
        throws:(针对一个方法抛出的异常)
        抛出一个异常,可以是系统定义的,也可以是自己定义的。
     
    抛出java中的一个系统异常:
    public class One {
    public void yichang() throws NumberFormatException{
    int a = Integer.parseInt("10L");
    }
    public static void main(String[] args){
    One test = new One();
    try{
    test.yichang();
    }catch(NumberFormatException e){
    System.out.println(e.getMessage());
    }
    }
    }
     
    抛出一个自定义异常:
     
    public class People {
    public static int check(String strage) throws MyException{
    int age = Integer.parseInt(strage);
    if(age < 0){
    throw new MyException("年龄不能为负数!");
    }
    return age;
    }
    public static void main(String[] args){
    try{
    int myage = check("-101");
    System.out.println(myage);
    }catch(NumberFormatException e){
    System.out.println("数据格式错误");
    System.out.println("原因:" + e.getMessage());
    }catch(MyException e){
    System.out.println("数据逻辑错误");
    System.out.println("原因:" + e.getMessage());
    }
    }
    }
     
    public class MyException extends Exception{
    private static final long serialVersionUID = 1L;
    private String name;
    public MyException(String name){
    this.name = name;
    }
    public String getMessage(){
    return this.name;
    }
    }
     
    那么下面我要说究竟什么时候用哪种:
     
     如果是系统异常的话可以什么都不用做,也可以针对方法抛出一个异常,因为系统异常是可以被系统自动捕获的,所以这个异常究竟是要在方法内部解决还是交给上层函数去解决其实效果是一样的。但是我查了很多资料,即使会抛出异常能被系统所捕获的话还是建议针对方法写一个throws,因为这样在完成一个大型任务的时候可以让别的程序员知道这里会出现什么异常。
     
    如果是自己定义的异常,则必须要用throws抛出该方法可能抛出的异常,否则编译会报错。
  • 相关阅读:
    C++入门经典-例8.5-多重继承
    C++入门经典-例8.3-子类显示调用父类构造函数
    C++入门经典-例8.2-构造函数的访问顺序
    C++入门经典-类成员的可访问性,继承后的可访问性
    C++入门经典-例8.1-类的继承
    C++入门经典-例7.10-运算符的重载,重载加号运算符
    C++入门经典-例7.9-对象数组,批量化生产
    C++入门经典-例7.8-const对象,标准尺寸
    C++入门经典-例7.7-对象与复制,菌类的繁殖
    C++入门经典-例7.6-this指针,同一个类的不同对象数据
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/4926106.html
Copyright © 2011-2022 走看看