您的位置:首页 > 编程语言

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

2016-11-16 23:22 274 查看

引子

在以前写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,不会有任何错误提示,这是一个小缺点。

说了这么多,总结一下,从写程序的角度来说,一定要判断各种可能出现的异常情况,然后进行相应的输出提示或处理,这样写出来程序用户体验才会好。当然,人无完人,多检查,多测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程思维
相关文章推荐