OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5719|回复: 1

第二章 异常处理

[复制链接]

45

主题

115

帖子

1

精华

版主

Rank: 7Rank: 7Rank: 7

积分
679
金钱
679
注册时间
2013-9-23
在线时间
95 小时
发表于 2014-5-6 22:29:17 | 显示全部楼层 |阅读模式
作为一种高级计算机语言,程序在运行的时候需要能够处理人为或者其他原因所带来的异常错误。C语言所提供的是一种函数返回值机制加上if判断语句来处理各种所能预知的异常情况。通常我们知道单片机在出现无效的空间地址访问时会直接转跳至hardfault等异常区域然后停止工作。这种情况看似能够有效保护程序对硬件所带来的危害,而实际上大部分时候我们是不希望系统就这么停止工作了。

UOL语言采用了类似Java的Exception模式。Java的异常机制是将可能与当前异常相关的所有方法路径全部压入栈中,这样用户遍可以轻松获取错误发生的准确地址和原因。然而,单片机的内存资源有限,我们不可能把每次发生的异常都压入栈中。针对这种情况,UOL语言采用了抛出错误代码的机制,只需要用整数值来代替错误信息。用户可以实用throw语句来主动抛出异常,然后用try-catch语句来捕捉throw抛出的异常或者是虚拟机本身所抛出的异常。

例如,下面的代码打算打印字符串对象的长度,由于对象本身为null(空),所以虚拟机会在调用字符串对象时抛出错误并停止工作

输入如下代码
public class Test
{
    public static void main()
    {
        String s=null;//
        System.out.printString("start of testing");
        System.out.newLine();
        //打印字符串对象长度,由于对象s为null,
        //所以会引发虚拟机抛出错误而停止工作
        System.out.printInt(s.length());
        /****以下代码将不会工作****/
        System.out.newLine();
        System.out.printString("end of testing");
        System.out.newLine();    
        while(true)
        {

        }
    }
}
你将在串口助手中看到如下信息:


其中error code = 14表示null pointer error,可以查看源码errcode.h

当使用try-catch语句时,系统不会因为出现异常而停止工作,只是转跳到catch语句中。这时用户可以按需要自己处理异常。
例如:

public class Test
{
       public static void main()
       {
             //对象必须初始化,这里初始化为null
             String s=null;
             System.out.printString("start of testing");
             System.out.newLine();
             try
            {
                 //s为null,虚拟机抛出异常
                 System.out.printInt(s.length());
            }
            catch(int e)
            {
                  System.out.printString("error = ");
                  System.out.printInt(e);
                  System.out.newLine();
            }
            /****以下代码将继续工作****/
            System.out.newLine();
            System.out.printString("end of testing");
            System.out.newLine();
            while(true)
            {

            }
      }
}

编译运行后,你将在串口助手中看到如下信息:


这次程序不会因为异常而停止工作,你可以看到end of testing。

除了虚拟机抛出异常,其实也可以人为主动抛出异常。只需要判断字符串对象s是否为null来决定是否throw异常。例如:

public class Test
{
     public static void main()
    {
           //对象必须初始化,这里初始化为null
           String s=null;
           System.out.printString("start of testing");
           System.out.newLine();
           try
           {
                   //判断如果是null,则主动抛出异常
                   if(s==null) throw 100;
                   System.out.printInt(s.length());
           }
           catch(int e)
           {
                   System.out.printString("error = ");
                   System.out.printInt(e);
                   System.out.newLine();
             }
            /****以下代码将继续工作****/
           System.out.newLine();
           System.out.printString("end of testing");
           System.out.newLine();
           while(true)
          {

          }
     }
}

编译运行后可以看到如下信息:


这里我们人为的抛出了值为100的异常信息。

Test.uol

585 Bytes, 下载次数: 138

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2014-5-6 23:09:23 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-23 23:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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