表单类,继续获得" System.StackOverflowException"在一个简单的代码测试

时间:2016-04-22 14:55:18

标签: c# .net winforms inheritance

我一直在尝试实现和调整我的编码风格,更多的是程序编程风格,但在尝试运行另一个使用系统注册表的类时遇到了问题。此外,代码在主类中工作正常。 P.S我来自一个脚本背景。

代码错误:未处理的类型' System.StackOverflowException'发生在System.Windows.Forms.dll

我已经从主应用程序中删除了代码,以便更容易找到问题。

主要表单类:

import java.util.StringTokenizer;
import java.util.regex.Pattern;

public class CommandFormatValidator {

    private Pattern adlPatternAll = Pattern
            .compile("^ACTV/(READ|ADD|DEL|RPL)/ADL.*");

    private Pattern adlPatternAddDefault = Pattern
            .compile("^ACTV/ADD/ADL/(DFLTTY((/([A-Z0-9]{7})){1,5})|DFLMIN(/[0-9]{1,4}))");

    private Pattern adlPatternDeleteTtymailGeneral = Pattern
            .compile("^ACTV/(DEL|READ)/ADL/TTYMAIL(/[A-Z0-9]{7})?");

//around 20 more pattern declarations...

public void validate(Object payload){

        String command = (String)payload;

        if (adlPatternAll.matcher(command).matches()) {
            if (!adlPatternAddDefault.matcher(command).matches()) {
                if (!adlPatternAddCityTty.matcher(command).matches()) {
                    if (!adlPatternAddCityFltTty.matcher(command).matches()) {
                        if (!adlPatternAdd.matcher(command).matches()) {
                            if (!adlPatternDelDefault.matcher(command).matches()) {
                                if (!adlPatternDel.matcher(command).matches()) {
                                    if (!adlPatternDelCityFltTty.matcher(command).matches()) {
                                        if (!adlPatternRpl.matcher(command).matches()) {
                                            if (!adlPatternRead.matcher(command).matches()) {
                                                if (!adlPatternReadCityFlt.matcher(command).matches()) {
                                                    if(!adlPatternAddTtymail.matcher(command).matches()) {
                                                        if( !adlPatternDeleteTtymailGeneral.matcher(command).matches()) {
                                                            if (!adlPatternDeleteTtymail.matcher(command).matches()) {
                                                                throw new ServiceException(CommandErrors.INVALID_FORMAT);
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

识别TestClass:

public partial class Form1test : Form
{
    // An unhandled exception of type 'System.StackOverflowException' 
    // occurred in System.Windows.Forms.dll
    public Form1test() 
    {
        TestClass lsr = new TestClass();
        lsr.chkRegAct();
        InitializeComponent();
    }  
}

2 个答案:

答案 0 :(得分:5)

TestClass源自Form1Test

您创建一个新的TestClass,结果调用基类(Form1Test)的构造函数,该构造函数生成一个新的TestClass,结果调用基类的构造函数({{1生成一个新的Form1Test,它会调用基类(TestClass)的构造函数,生成一个新的Form1Test,从而调用基类的构造函数({{1}生成一个新的TestClass,它会调用基类(Form1Test)的构造函数,生成一个新的TestClass,从而调用基类的构造函数({{1}生成一个新的Form1Test,它会调用基类(TestClass)的构造函数,生成一个新的Form1Test,从而调用基类的构造函数({{1}生成一个新的TestClass,它会调用基类(Form1Test)的构造函数,生成一个新的TestClass,从而调用基类的构造函数({{1} }})生成.....

由于无限递归导致的大量函数调用导致的StackOverflowException。

答案 1 :(得分:3)

由于继承链 TestClass:Form1test 。调用TestClass构造函数会创建无限递归。