java中抛出throw关键字是怎么用的? 举例?

5.抛出throw关键字   

马克-to-win:我们先说5/0的原理,当程序运行到5/0的时候,java系统JVM会在后台new出一个除0异常实例,之后把这个实例传入catch块儿供开发者使用。马克-to-win:而这里throw new Exception();是开发者自己主动new出一个异常实例,之后把这个实例传入catch块儿供开发者自己使用。马克-to-win:对于catch来讲,不管谁抛的,处理起来都一样。 

(新手必须忽略)意义是什么?见后面的sun的例子(1.5.4_a):if(url==null) throw new sqlException见例:1.5.4,这样就可以做到,有经验的人(这里是sun公司),预感到大家都易犯url==null这样的毛病(你开始不知道),于是他就throw new sqlException,(但是在sun公司写那段代码时,他又不能处理,因为逻辑上,就应该是你后来者的任务或说义务,举一个例子,爷爷规定遗产只能干教育,具体是生物还是物理或是数学他并不管,这里就是你必须管,但怎么管,怎么catch,你来做定夺,前人无法替你做决定)逼着你这个新手,必须catch这样的毛病,否则你的程序会崩溃。提醒你了,你不处理都不行。

例:1.5.1-

public class Test {
    public static void main(String[] args)  {
        int mark_to_win = 0;
        int c;
        if (mark_to_win == 0) throw new ArithmeticException("divide by 0");
        else c=8/mark_to_win;   
        System.out.println("马克-to-win:优雅结束");
    }
}

输出结果:

Exception in thread "main" java.lang.ArithmeticException: divide by 0
    at Test.main(Test.java:5)

 

例:1.5.2-

public class Test {
    public static void main(String[] args)  {
        int mark_to_win = 0;
        int c;
        if (mark_to_win == 0)  c=8/mark_to_win;
        else c=8/mark_to_win;   
        System.out.println("马克-to-win:优雅结束");
    }
}

输出结果:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at Test.main(Test.java:5)

马 克-to-win:通过观察,我们发现上面两个例子最后报的异常的地方是一样的!异常的效果也是等价的!马克-to-win:如上面我们的讲的,只不过一 个是JVM系统抛出的,一个是我们自己主动抛出的。马克-to-win:所以为了不让系统崩溃,我们需要像原来一样捕获一下异常就可以了。

例:1.5.3-

public class Test {
    public static void main(String[] args)  {
        int mark_to_win = 0;
        int c;
        try{
            if (mark_to_win == 0) throw new ArithmeticException("divide by 0");
            else c=8/mark_to_win;             
        }catch(ArithmeticException a)
        {
            System.out.println(a);
        }
        System.out.println("马克-to-win:优雅结束");
       
    }
}

输出结果:

java.lang.ArithmeticException: divide by 0
马克-to-win:优雅结束

 

请大家参见下面sun公司的java.sql.DriverManager.getConnection的源代码。在我们的代码中, 我们也需要处理SQLException

例:1.5.4_a:

 

    private static Connection getConnection(
        String url, java.util.Properties info, Class<?> caller) throws SQLException {
        /*
         * When callerCl is null, we should check the application's
         * (which is invoking this class indirectly)
         * classloader, so that the JDBC driver class outside rt.jar
         * can be loaded from here.
         */
        ClassLoader callerCL = caller != null ? caller.getClassLoader() : null;
        synchronized(DriverManager.class) {
            // synchronize loading of the correct classloader.
            if (callerCL == null) {
                callerCL = Thread.currentThread().getContextClassLoader();
            }
        }

        if(url == null) {
            throw new SQLException("The url cannot be null", "08001");
        }

 

 

例:1.5.4(参考视频讲课用,新手必须忽略)

import java.sql.SQLException;

public class Test {
    public static void main(String[] args) throws 
            ClassNotFoundException {
        java.sql.Connection connection = null;
        java.sql.Statement statement = null;
        java.sql.ResultSet resultSet = null;
        Class.forName("com.mysql.jdbc.Driver");
        try {
            connection = java.sql.DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/test", "root", "1234");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            statement = connection.createStatement();
            resultSet = statement.executeQuery("select * from login");
            while (resultSet.next()) {
                System.out.println(resultSet.getString("id") + "--"
                        + resultSet.getString("name"));
            }
            resultSet.close();
            statement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

更多请看下节:https://blog.csdn.net/qq_44639795/article/details/103109346

posted @ 2021-03-11 08:48  师徒行者  阅读(344)  评论(0编辑  收藏  举报