Java 程序在试图分析字符串时冻结

Java 程序在试图分析字符串时冻结,java,freeze,polynomials,Java,Freeze,Polynomials,我正在写一个方法,它应该分析用户给出的多项式(作为字符串),并在将来用它做不同的事情。当时,我正试图测试我目前掌握的代码,但每当我执行程序时,它就会冻结,在电脑前坐了几个小时后,我仍然找不到其中的罪犯 我在测试是否可以分析一个变量的多项式,然后重新打印,但它不起作用 我希望有人能帮我解决这个问题 这是执行该方法的主代码块,字符串userInput是一个多项式(例如4x-6x^2): 下面是monomials类及其方法analysis(): //类单项式 类单项式 { 私有整

我正在写一个方法,它应该分析用户给出的多项式(作为字符串),并在将来用它做不同的事情。当时,我正试图测试我目前掌握的代码,但每当我执行程序时,它就会冻结,在电脑前坐了几个小时后,我仍然找不到其中的罪犯

我在测试是否可以分析一个变量的多项式,然后重新打印,但它不起作用

我希望有人能帮我解决这个问题

这是执行该方法的主代码块,字符串userInput是一个多项式(例如4x-6x^2):

下面是monomials类及其方法analysis():

//类单项式
类单项式
{           
私有整数系数=0;
私有字符变量;
私有int addpow=1;
私人国际战俘;
私有字符符号='^';
私有字符减号='-';
私有布尔值为负=假;
私有串单声道;
StringBuilder StringBuilder=新的StringBuilder();
公共int-getCoeff(int-coeff)
{
返回系数;
}
公共无效设置系数(内部系数)
{
this.coeff=coeff;
}
公共void setVar(char var)
{
this.var=var;
}
公共无效setPow(内部pow)
{
this.pow=pow;
}
公共字符串getMono(字符串单项式)
{
返回单声道;
}
//方法进一步分析用户的输入。
公共空间分析(字符串多项式)
{
//将poynomial拆分为单项式,并将其存储在数组列表中。
多项式=多项式.replaceAll(“-”,“+-”);
字符串多段[]=多项式.split(\\+);
ArrayList单项式=新的ArrayList(Arrays.asList(polyParts));
//迭代单项式。

对于(inti=0;i您的一个循环正在无限运行。您应该用if条件替换它

while (Character.isDigit(c))
                {
                    countcoeff++;
                    x++;
                }
换成

if (Character.isDigit(c))
                {
                    countcoeff++;
                    x++;
                }

或者您可以在此处使用break语句。

您有两个永远不会退出的循环:

while (Character.isDigit(c))
{
    countcoeff++;
    x++;
}
如何找到这样的东西? 如果您使用Eclipse,您可以在调试模式下运行代码,切换到调试透视图并单击黄色的挂起符号。这将挂起您的程序,在调试视图中,您可以看到线程“挂起”的行,如果您单击它,它将打开源代码

如果您不使用具有该功能的IDE,则可以使用JDK工具:使用
jps
查找程序的ID:

C:\jdk\jdk8u45x64\jdk1.8.0_45\bin>jps
7216
5688 Jps
6248 Monomials
然后使用
jstack
打印所有运行线程的堆栈跟踪:

C:\jdk\jdk8u45x64\jdk1.8.0_45\bin>jstack 6248
[other threads omitted]

"main" #1 prio=5 os_prio=0 tid=0x000000000203e800 nid=0x1b2c runnable [0x000000000201e000]
   java.lang.Thread.State: RUNNABLE
        at Monomials.analyse(Monomials.java:77)
        at Monomials.main(Monomials.java:10)

正如其他人已经说过的那样

while (Character.isDigit(c))
这是你的问题。 但是你有两次而不是一次,所以这两次都是问题。第二次不是真正的问题,因为
Character.isDigit
if(c==powsign)
不能同时都是真的,所以第二次infit循环永远不会执行,这就把我带到了下一点:bug。
在您的代码中有大量这样的代码:-D

这两个for循环都在运行(
您可以在不同的步骤中放置一些System.out.println,以查看发生了什么情况,并添加到所有的“use debugger”/“use
System.out
”中。我还要添加“break that method up!”。无论你在哪里发表评论,你都会大声说这个方法太大了。你应该把它们分开,看看是否可以通过测试框架(如Junit或NGTest)独立测试这个新的小方法非常感谢,虽然hinneLinks对我的问题给出了最好的答案,但你暗示了在摆脱无限循环后出现的所有其他问题的解决方案。
C:\jdk\jdk8u45x64\jdk1.8.0_45\bin>jstack 6248
[other threads omitted]

"main" #1 prio=5 os_prio=0 tid=0x000000000203e800 nid=0x1b2c runnable [0x000000000201e000]
   java.lang.Thread.State: RUNNABLE
        at Monomials.analyse(Monomials.java:77)
        at Monomials.main(Monomials.java:10)
while (Character.isDigit(c))