返回列表 发新帖

【Android入坑系列教程】47.异常(一)---面向对象

[复制链接]

62

主题

722

回帖

2756

积分

大学生

Rank: 5Rank: 5

金币
2029
好评
12
信誉
100

考神

发表于 2019-4-5 12:42:15 | 显示全部楼层 | 阅读模式  来自 四川
本帖最后由 pansong291 于 2019-4-3 12:29 编辑

上篇:46.对象的多态性(二)---面向对象
下篇:48.异常(二)---面向对象

注意:如果你的回复只是“感谢分享”、“辛苦了”之类的与教程内容无关的字眼,还请不要回复本帖,谢谢合作!!!
注意:如果你的回复只是“感谢分享”、“辛苦了”之类的与教程内容无关的字眼,还请不要回复本帖,谢谢合作!!!
注意:如果你的回复只是“感谢分享”、“辛苦了”之类的与教程内容无关的字眼,还请不要回复本帖,谢谢合作!!!


了解异常
异常定义了程序中遇到的非致命的错误, 而不是编译时的语法错误,如程序要打开一个
不存的文件、网络连接中断、操作数越界、装载一个不存在的类等。
我们先来看看下面的程序代码吧:
public class TestException
{
    public static void main(String [] args)
    {
        int result = new Test().devide( 3, 0 );
        System.out.println("the result is" + result );
    }
}
class Test
{
    public int devide(int x, int y)
    {
        int result = x/y;
        return x/y;
    }
}
编译运行上面的程序,将出现如下错误:

读者应注意一下出错的行号,就能够发现错误的位置。
上面的程序运行的结果报告发生了算术异常(ArithMethicException),系统不再执行
下去,提前结束,这种情况就是我们所说的异常。

try… catch 语句
我们将上面的程序代码进行如下修改:
public class TestException
{
    public static void main(String [] args)
    {
        try
        {
            int reslut = new Test().devide( 3, 0 );
            System.out.println("the result is" + reslut );
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        System.out.println("program is running here ,that is normal !");
    }
}
class Test
{
    public int devide(int x, int y)
    {
        int result = x/y;
        return x/y;
    }
}
程序运行结果如下:

我们看到程序在出现异常后,系统能够正常的继续运行,而没有异常终止。在上面的程
序代码中,我们对可能会出现错误的代码用 trycatch 语句进行了处理,当 try 代码块中
的语句发生了异常,程序就会跳转到 catch 代码块中执行,执行完 catch 代码块中的程序代
码后,系统会继续执行 catch 代码块后的其他代码,但不会执行 try 代码块中发生异常语句
后的代码,如程序中的 System.out.println("the result is" + result ); 不会再被执行。
可见 Java 的异常处理是结构化的,不会因为一个异常影响整个程序的执行。
try 代码块中的程序发生了异常,系统将这个异常发生的代码行号,类别等信息封装
到一个对象中,并将这个对象传递给 catch 代码块,所以我们看到 catch 代码块是以下面的
格式出现的。
catch(Exception e)
{
    System.out.println(e.getMessage());
}
catch 关键字后跟有一个用括号括起来的 Exception 类型的参数 e,这跟我们经常用到
的如何定义一个函数接收的参数格式是一样的。括号中的 Exception 就是 try 代码块传递给
catch 代码块的变量类型,e 就是变量名,所以我们也可以将 e 改用成别的名称(如 ex 等)
如下所示:
catch(Exception ex)
{
    System.out.println(ex.getMessage());
}

throws 关键字
针对上面的例子,我们假设 TestException 类与 Test 类不是同一个人写的,写 TestException
类的人,在 main 方法中调用 Test 类的 devide 方法时,怎么能知道 devide 方法有可
能出现异常情况呢?他又怎么能够想到要用 try catch 语句去处理可能发生的异常呢?
问题可以这样解决,只要写 Test 类的人,在定义 devide 方法时,在 devide 方法参数
列表后用 throws 关键字声明一下,该函数有可能发生异常及异常的类别。这样,调用者在
调用该方法时,就必须用 trycatch 语句进行处理,否则,编译将无法通过。如下面的程
序代码:
public class TestException
{
    public static void main(String [] args)
    {
        int result = new Test().devide( 3, 1 );
        System.out.println("the result is" + result );
    }
}
class Test
{
    public int devide(int x, int y) throws Exception
    {
        int result = x/y;
        return x/y;
    }
}
编译上面的程序,将出现如下的编译错误。

尽管我们已经将传给 devide 函数中的第二个参数改为了 1,程序在运行时不可能发生错误,
但由于定义 devide 函数时声明了它有可能发生异常,调用者就必须使用 trycatch 语句
进行处理,这叫防患于未然。
将程序作如下修改:
public class TestException
{
    public static void main(String [] args)
    {
        try
        {
            int result = new Test().devide( 3, 1 );
            System.out.println("the result is" + result );
        }
        catch(Exception e)
        {
            e.printStackTrace(); // 很多人为了简单,不写这一句。
        }
    }
}
编译上面的程序,没有任何问题了。
小经验:很多人确信自己的程序中不会发生某种异常,trycatch 语句似乎成了应对
编译器而不得已的手段,为了简单,他们往往在 catch 代码块中什么也不写,就象上面标注
的那样。trycatch 成了一种摆设。作者强烈要求读者养成良好的编程习惯,不要回避这
一点辛劳,贪图这么一点时间。在 catch 代码块中,最好有处理异常的代码,否则,一旦程
序在运行过程中出现了异常,导致最终运行结果与我们期望的不一致,我们就很难发现问题
的原因了。
throws 关键字的其他用处
如果一个方法中的语句执行时可能生成某种异常,但是并不能确定如何处理,则此方法
应声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。也
就是,程序中异常没有用 trycatch 捕捉异常、处理异常的代码,我们可以在程序代码所
在的函数(方法)声明后用 throws 声明该函数要抛出异常,将该异常抛出到该函数的调用
函数中,一直到 main 方法,JVM 肯定要处理的,这样,编译就能通过了。用作者的话讲,就
是将麻烦传递给了上级,村长传给乡长,乡长不处理就传给县长,县长不处理又传给市长,
最后一直传到国务院,就截止了,因为国务院没有上级了。在 Java 程序中, 异常传递到
main 方法后,就截止了,因为没有哪个方法会调用 main 方法的。
如上面的程序就可以改写成下面这样:
public class TestException
{
    public static void main(String [] args) throws Exception
    {
        int result = new Test().devide( 3, 1 );
        System.out.println("the result is" + result );
    }
}
虽然编译能够通过,但异常一旦发生,没有被处理,程序就会非正常终止。即使你能确信在
你的程序中不会发生某种异常,这种方法也能够简化程序的编写,但完全违背了 Java 设计
异常的初衷,不建议在正规的程序中使用。用这种方法写点实验性的代码,倒是无可厚非。

上篇:46.对象的多态性(二)---面向对象
下篇:48.异常(二)---面向对象

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

428

主题

6604

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
5318
好评
44
信誉
185

考神MT论坛帅哥MT论坛活跃会员MT论坛最佳新人MT论坛灌水老大MT论坛新人

发表于 2020-3-3 23:29:13 来自手机  | 显示全部楼层  来自 上海
厉害了我的哥
回复

使用道具 举报

7

主题

2323

回帖

4081

积分

大学生

Rank: 5Rank: 5

金币
634
好评
2
信誉
100
发表于 2020-6-16 13:12:01 | 显示全部楼层  来自 广东
小白来学习了,感谢大佬分享
回复

使用道具 举报

9

主题

1543

回帖

4734

积分

大学生

Rank: 5Rank: 5

金币
2609
好评
21
信誉
100
发表于 2020-7-29 14:12:37 | 显示全部楼层  来自 陕西
这如果是一系列视频教程改多好
回复

使用道具 举报

107

主题

9692

回帖

2万

积分

博士后

Rank: 8Rank: 8

金币
10789
好评
39
信誉
99

MT论坛活跃会员

发表于 2020-8-9 18:59:50 来自手机  | 显示全部楼层  来自 上海
感谢分享
回复

使用道具 举报

361

主题

4499

回帖

1万

积分

博士生

大佬

Rank: 7Rank: 7Rank: 7

金币
258
好评
62
信誉
107

考神MT论坛最佳新人MT论坛帅哥MT论坛活跃会员MT论坛灌水老大MT论坛侠客MT论坛新人

发表于 2020-8-16 15:37:43 来自手机  | 显示全部楼层  来自 广东
路过看看
回复

使用道具 举报

7

主题

5613

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
10774
好评
0
信誉
96
发表于 2020-8-17 20:33:03 来自手机  | 显示全部楼层  来自 江苏
路过看看
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表