养成在程序中对可能出现的异常进行处理的习惯
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,不会有任何错误提示,这是一个小缺点。
说了这么多,总结一下,从写程序的角度来说,一定要判断各种可能出现的异常情况,然后进行相应的输出提示或处理,这样写出来程序用户体验才会好。当然,人无完人,多检查,多测试。
相关文章推荐
- 服务程序出现:未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
- 如何设置当程序出现异常后进行重启
- 【转】Android 中处理崩溃异常并重启程序出现页面重叠的问题
- socket.io使用netscaler作为代理服务器进行转发时可能出现的问题及其处理办法
- 使用Matisse Form编写聊天程序出现的异常处理方案
- Windows下截获程序的异常并进行处理
- android 中处理崩溃异常并重启程序出现页面重叠的问题
- 对异常处理中的一个问题的思考(出现异常,程序仍能继续运行)
- 对vc++6.0的程序进行移植时出现的错误及处理(一)
- 今天遇到一个问题:在程序中加入的定时触发器,当时出现这样一个问题,触发器定时2秒,程序从后台查询数据经过复杂处理后时间超过了2秒,我查阅好些网络上说有可能触发器等待程序执行完毕后,在触发下一次,也有说
- android 中处理崩溃异常并重启程序出现页面重叠的问题
- 使用两个不同类型的数据进行加法计算时,使用异常处理语句捕获由于数据类型错误而出现的异常,发生生成错误。是否继续并运行上次的成功生成?
- C# B/S程序中出现“异常详细信息: System.Data.SqlClient.SqlException: 用户 'XXX/ASPNET' 登录失败。”的处理方法
- SQL Server 抛出自定义异常,由C#程序俘获之并进行相应的处理
- 格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ 进行反序列化时出错: GetLzdtArticleResult。InnerException 消息是“反序列化对象 属于类型 lzdt.DTO.Dtolzdt[] 时出现错误。读取 XML 数据时,超出最大
- 求救!!!各位大哥帮帮忙!未处理的“System.ArithmeticException”类型的异常出现在 system.drawing.dll 中.
- 对sharepoint 的form library的事件进行处理(二)开发事件处理程序
- 解决多线程操作控件时可能出现的异常:“在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级”
- MDI 程序一退出就出现程序异常
- asp.net调用Console程序,异常未结束的处理。