养成在程序中对可能出现的异常进行处理的习惯

引子

在以前写WEB后台的时候,我们就见过各种异常,比如POST或者GET的值没过来,如果这时候只写了逻辑操作,就会带来问题,PHP中是用isset函数(PHP处理这些确实很方便),判断是否存在。因为我们实际的生产环境不可能只输入正确的值,错误,或者说异常处理就显得非常重要。
在大学上UNIX操作系统选修课时,老师叫段翰聪,是位很厉害的LINUX骨灰级玩家。他说,一个程序,对错误处理的代码一般是要占至少一半,很多都是占了三分之二,现在想来,这句话挺经典的。

正文

下面还是上代码,是一道比较经典的算法题目。有二叉树的前序,中序(数组描述),还原整个二叉树

class BinaryTree {

private Object data;
BinaryTree left;
BinaryTree right;

public BinaryTree(Object data){
    this.data=data;
    left=right=null;
}

public BinaryTree(Object data,BinaryTree left,BinaryTree right){

    this.data=data;
    this.left=left;
    this.right=right;
}

public String toString(){
    return data.toString();
}

public  void preOrder(BinaryTree parent){

    if(parent ==null)
        return ;
    System.out.print(parent.data+" ");
    preOrder(parent.left);
    preOrder(parent.right);

}

public void inOrder(BinaryTree parent){
    if(parent==null)
        return ;
    inOrder(parent.left);
    System.out.print(parent.data+" ");
    inOrder(parent.right);

}
public void laOrder(BinaryTree parent){
    if(parent==null)
        return ;
    inOrder(parent.left);

    inOrder(parent.right);
    System.out.print(parent.data+" ");

}

package Tree;

/**
* Created by Administrator on 2016/11/16.
*/

//构建二叉树,根据前序和中序的顺序。还可以打印后序
public class test6 {
public BinaryTree Construct(int []pre,int[]in){

    if(pre==null||in==null)
        return null;

    if(pre.length<=0||pre.length!=in.length)
        return null;

    BinaryTree root=ConstructCore(pre,0,pre.length-1,in,0,in.length-1);
    return root;


}

//递归函数核心
private BinaryTree ConstructCore(int []pre,int startPre,int endPre,int[]in,int startIn,int endIn){

       if(startPre>endPre||startIn>endIn)
           return null;

//创建,根节点,值为前序序列的第一个值
BinaryTree root=new BinaryTree(pre[startPre]);

    for(int i=startIn;i<=endIn;i++)
        if(in[i]==pre[startPre]){
            root.left=ConstructCore(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
            root.right=ConstructCore(pre,i-startIn+startPre+1,endPre,in,i+1,endIn);
        }

    return root;


}

public static void main(String [] args){

    int []pre={1,2,4,7,3,5,6,8};
    int []in={4,7,2,1,5,3,6,8};
    test6 a=new test6();

    BinaryTree root=a.Construct(pre,in);
    root.preOrder(root);
    System.out.println("");
    root.laOrder(root);
}

}

这个算法的思想跟二叉树的大部分算法思想一样,都是利用递归,先在中序序列里找到根节点,然后把左子树和右子树当成二叉树,进行递归,最后返回根节点的位置,此时就可以以进行打印,为了测试就打印了前序和后序。

在算法中,也注意到了一些边界值和逻辑判断,比如数组是否为空,前序和后序是否相等等。但在最后进行递归的时候,一个很重要的一点,这里用了for循环,找出中序数组里根节点的位置。但假如输入的数组,不存在两个一样的值(当然这种情况比较少),这个函数就会在创建了根节点后直接返回root,不会有任何错误提示,这是一个小缺点。

说了这么多,总结一下,从写程序的角度来说,一定要判断各种可能出现的异常情况,然后进行相应的输出提示或处理,这样写出来程序用户体验才会好。当然,人无完人,多检查,多测试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值