![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
问一个简单的java程序运行的问题
先把代码贴上来:classLoops{intLoop1(intcount){count++;returnLoop2(count);}intLoop2(intcount){...
先把代码贴上来:
class Loops
{
int Loop1(int count)
{
count++;
return Loop2(count);
}
int Loop2(int count)
{
count++;
if (count<6314)
return Loop1(count);
else return count;
}
public static void main(String[] arguments)
{
int i=0;
Loops loopValue=new Loops();
System.out.println(loopValue.Loop1(i));
}
}
这个程序得出的结果事显而易见的。但如果我调整方法Loop2中的if判断的数岛6315,在控制台中运行就得不到结果,显示如下:
at Loops.Loop1(Loops.java:6)
at Loops.Loop2(Loops.java:12)
at Loops.Loop1(Loops.java:6)
at Loops.Loop2(Loops.java:12)
at Loops.Loop1(Loops.java:6)
at Loops.Loop2(Loops.java:12)
........
这个显示的应该是方法调用的记录。6315是堆栈长度的限制么?我刚学java,很多概念还是c语言的,不好意思哈。望高手解答。
:-),那个说帮我小小改一下程序的人,我刚学了两三天,还看不懂你的程序,感觉好复杂,还涉及到网络参数?好奇怪,再学几天再看你的程序。还有就是你可能曲解了我的意思,我就是看看java会不会自动在编译时接触两个方法互相调用时产生的死锁。如果是你说的那样的话,为什么必须当方法调用数到达一个特定值的时候,程序才会产生相互调用的错误呢?我也觉得应该是堆栈溢出,按照我对C语言的理解以及递推
还有那个确实是6316,而且多次运行一直都是,是不是和我的系统或者内存有关系?
我用的ubuntu的openjdk,和编译器有没有关系?它也不给我提示stack over flow error。 展开
class Loops
{
int Loop1(int count)
{
count++;
return Loop2(count);
}
int Loop2(int count)
{
count++;
if (count<6314)
return Loop1(count);
else return count;
}
public static void main(String[] arguments)
{
int i=0;
Loops loopValue=new Loops();
System.out.println(loopValue.Loop1(i));
}
}
这个程序得出的结果事显而易见的。但如果我调整方法Loop2中的if判断的数岛6315,在控制台中运行就得不到结果,显示如下:
at Loops.Loop1(Loops.java:6)
at Loops.Loop2(Loops.java:12)
at Loops.Loop1(Loops.java:6)
at Loops.Loop2(Loops.java:12)
at Loops.Loop1(Loops.java:6)
at Loops.Loop2(Loops.java:12)
........
这个显示的应该是方法调用的记录。6315是堆栈长度的限制么?我刚学java,很多概念还是c语言的,不好意思哈。望高手解答。
:-),那个说帮我小小改一下程序的人,我刚学了两三天,还看不懂你的程序,感觉好复杂,还涉及到网络参数?好奇怪,再学几天再看你的程序。还有就是你可能曲解了我的意思,我就是看看java会不会自动在编译时接触两个方法互相调用时产生的死锁。如果是你说的那样的话,为什么必须当方法调用数到达一个特定值的时候,程序才会产生相互调用的错误呢?我也觉得应该是堆栈溢出,按照我对C语言的理解以及递推
还有那个确实是6316,而且多次运行一直都是,是不是和我的系统或者内存有关系?
我用的ubuntu的openjdk,和编译器有没有关系?它也不给我提示stack over flow error。 展开
7个回答
展开全部
我也是用Ubuntu 而且也是 openJdk
但是当改为6315的时候就已经报下面的错了.当是6314的时候则返回6314
Exception in thread "main" java.lang.StackOverflowError
at com.banxi.zhidao.Loops.Loop1(Loops.java:7)
at com.banxi.zhidao.Loops.Loop2(Loops.java:14)
at com.banxi.zhidao.Loops.Loop1(Loops.java:8)
当我把程序改成下面打印输出就可以看到临界值变了,所以说不是这个数字有什么特殊的.
而是堆栈的 内在大小是一定的..,我发现下面的这个MAX_BOUND的变化是因为两个函数调用吧.所以增2调用才变化
.下面的输出结果显示,到Count的值为6303就抛出异常了,所以此时的临界值变成了小了.
变成了异常也变成与输入输出调用有关.这些调用运行时变量空间是创建在运行时堆栈上的.
所以是运行时堆栈大小一定吧.
如果把上面的MAX_BOUND改变6302的话就不会抛出异常了.
/****/
package com.banxi.zhidao;
class Loops
{
private int MAX_BOUND = 6314;
int Loop1(int count)
{
count++;
System.out.println("In loop1 Count:"+count);
return Loop2(count);
}
int Loop2(int count)
{
count++;
if (count<MAX_BOUND) {
System.out.println("In loop2 Count<"+MAX_BOUND+":"+count);
return Loop1(count);
}
else{
System.out.println("In loop2 Count>="+MAX_BOUND+":"+count);
return count;
}
}
public static void main(String[] arguments)
{
int i=0;
Loops loopValue=new Loops();
System.out.println(loopValue.Loop1(i));
}
}
/***/
In loop2 Count<6314:6292
In loop1 Count:6293
In loop2 Count<6314:6294
In loop1 Count:6295
In loop2 Count<6314:6296
In loop1 Count:6297
In loop2 Count<6314:6298
In loop1 Count:6299
In loop2 Count<6314:6300
In loop1 Count:6301
In loop2 Count<6314:6302
In loop1 Count:6303
Exception in thread "main" java.lang.StackOverflowError
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:128)
at java.io.PrintStream.write(PrintStream.java:447)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:220)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:290)
at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:103)
at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
at java.io.PrintStream.write(PrintStream.java:494)
at java.io.PrintStream.print(PrintStream.java:636)
at java.io.PrintStream.println(PrintStream.java:773)
at com.banxi.zhidao.Loops.Loop2(Loops.java:16)
at com.banxi.zhidao.Loops.Loop1(Loops.java:10)
at com.banxi.zhidao.Loops.Loop2(Loops.java:17)
但是当改为6315的时候就已经报下面的错了.当是6314的时候则返回6314
Exception in thread "main" java.lang.StackOverflowError
at com.banxi.zhidao.Loops.Loop1(Loops.java:7)
at com.banxi.zhidao.Loops.Loop2(Loops.java:14)
at com.banxi.zhidao.Loops.Loop1(Loops.java:8)
当我把程序改成下面打印输出就可以看到临界值变了,所以说不是这个数字有什么特殊的.
而是堆栈的 内在大小是一定的..,我发现下面的这个MAX_BOUND的变化是因为两个函数调用吧.所以增2调用才变化
.下面的输出结果显示,到Count的值为6303就抛出异常了,所以此时的临界值变成了小了.
变成了异常也变成与输入输出调用有关.这些调用运行时变量空间是创建在运行时堆栈上的.
所以是运行时堆栈大小一定吧.
如果把上面的MAX_BOUND改变6302的话就不会抛出异常了.
/****/
package com.banxi.zhidao;
class Loops
{
private int MAX_BOUND = 6314;
int Loop1(int count)
{
count++;
System.out.println("In loop1 Count:"+count);
return Loop2(count);
}
int Loop2(int count)
{
count++;
if (count<MAX_BOUND) {
System.out.println("In loop2 Count<"+MAX_BOUND+":"+count);
return Loop1(count);
}
else{
System.out.println("In loop2 Count>="+MAX_BOUND+":"+count);
return count;
}
}
public static void main(String[] arguments)
{
int i=0;
Loops loopValue=new Loops();
System.out.println(loopValue.Loop1(i));
}
}
/***/
In loop2 Count<6314:6292
In loop1 Count:6293
In loop2 Count<6314:6294
In loop1 Count:6295
In loop2 Count<6314:6296
In loop1 Count:6297
In loop2 Count<6314:6298
In loop1 Count:6299
In loop2 Count<6314:6300
In loop1 Count:6301
In loop2 Count<6314:6302
In loop1 Count:6303
Exception in thread "main" java.lang.StackOverflowError
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:128)
at java.io.PrintStream.write(PrintStream.java:447)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:220)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:290)
at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:103)
at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
at java.io.PrintStream.write(PrintStream.java:494)
at java.io.PrintStream.print(PrintStream.java:636)
at java.io.PrintStream.println(PrintStream.java:773)
at com.banxi.zhidao.Loops.Loop2(Loops.java:16)
at com.banxi.zhidao.Loops.Loop1(Loops.java:10)
at com.banxi.zhidao.Loops.Loop2(Loops.java:17)
展开全部
不是 的
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
应该是的,在我机子上试了的
出现Exception in thread "main" java.lang
stackoverflowError
我想问一下,你是怎么找到6315这个临界值的
在我机子上,好像不是这个值。
出现Exception in thread "main" java.lang
stackoverflowError
我想问一下,你是怎么找到6315这个临界值的
在我机子上,好像不是这个值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
给你简单修改了一下,你看看吧
import java.io.*;
import java.net.*;
import java.util.*;
import java.text.*;
public class ChatClient {
public static void main(String[] args) throws Exception {
Socket c = new Socket("127.0.0.1", 1123);
while (true) {
Date now = new Date();
DateFormat d = DateFormat.getDateTimeInstance();
String time = d.format(now);
PrintWriter OutputS = new PrintWriter(c.getOutputStream());
BufferedReader say = new BufferedReader(new InputStreamReader(System.in));
String Csay = say.readLine();
System.out.println("Client:" + String.valueOf(c.getLocalPort()) + Csay + time);
OutputS.println("Client:" + String.valueOf(c.getLocalPort()) + Csay + time);
OutputS.flush();
BufferedReader InputS = new BufferedReader(new InputStreamReader(c.getInputStream()));
System.out.println(InputS.readLine());
}
}
}
、、、、、、、、、、、、、、、、
import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;
public class ChatServer {
private static int PORTNUM = 1123;// 定义程序使用的端口号PORTNUM
public static void main(String args[]) throws Exception {
ServerSocket s = new ServerSocket(PORTNUM);
while (true) {
Socket s1 = s.accept();
BufferedReader InputS = new BufferedReader(new InputStreamReader(s1.getInputStream()));
System.err.println();
System.out.println(InputS.readLine());
Date now = new Date();
DateFormat d = DateFormat.getDateTimeInstance();
String time = d.format(now);
PrintWriter OutputS = new PrintWriter(s1.getOutputStream());
BufferedReader say = new BufferedReader(new InputStreamReader(System.in));
String Ssay = say.readLine();
OutputS.println("Server" + String.valueOf(s1.getLocalPort()) + Ssay + time);
OutputS.flush();
System.out.println("Server" + String.valueOf(s1.getLocalPort()) + Ssay + time);
}
}
}
说一下你的程序出现的原因吧!
你的客户端与程序段在开始运行都在监听对方发来的消息,当什么都不会有了,因为对方都在等着接受消息呢,这样就造成了死锁
import java.io.*;
import java.net.*;
import java.util.*;
import java.text.*;
public class ChatClient {
public static void main(String[] args) throws Exception {
Socket c = new Socket("127.0.0.1", 1123);
while (true) {
Date now = new Date();
DateFormat d = DateFormat.getDateTimeInstance();
String time = d.format(now);
PrintWriter OutputS = new PrintWriter(c.getOutputStream());
BufferedReader say = new BufferedReader(new InputStreamReader(System.in));
String Csay = say.readLine();
System.out.println("Client:" + String.valueOf(c.getLocalPort()) + Csay + time);
OutputS.println("Client:" + String.valueOf(c.getLocalPort()) + Csay + time);
OutputS.flush();
BufferedReader InputS = new BufferedReader(new InputStreamReader(c.getInputStream()));
System.out.println(InputS.readLine());
}
}
}
、、、、、、、、、、、、、、、、
import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;
public class ChatServer {
private static int PORTNUM = 1123;// 定义程序使用的端口号PORTNUM
public static void main(String args[]) throws Exception {
ServerSocket s = new ServerSocket(PORTNUM);
while (true) {
Socket s1 = s.accept();
BufferedReader InputS = new BufferedReader(new InputStreamReader(s1.getInputStream()));
System.err.println();
System.out.println(InputS.readLine());
Date now = new Date();
DateFormat d = DateFormat.getDateTimeInstance();
String time = d.format(now);
PrintWriter OutputS = new PrintWriter(s1.getOutputStream());
BufferedReader say = new BufferedReader(new InputStreamReader(System.in));
String Ssay = say.readLine();
OutputS.println("Server" + String.valueOf(s1.getLocalPort()) + Ssay + time);
OutputS.flush();
System.out.println("Server" + String.valueOf(s1.getLocalPort()) + Ssay + time);
}
}
}
说一下你的程序出现的原因吧!
你的客户端与程序段在开始运行都在监听对方发来的消息,当什么都不会有了,因为对方都在等着接受消息呢,这样就造成了死锁
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我试了下,发现这个值在变动。。。本来6315可以的。。。
在运行就变成6296了。。。
在运行就变成6296了。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
java调用的层数超出了内存的范围,跟电脑的内存有关,不同内存的电脑调用的最大次数是不同的。另外和所在项目下放的jar包也有关系,jar包太多的话调用次数就会相应减少
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不是啊;我试试了;结果是6316!!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询