重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

程序崩溃的java代码,代码崩溃怎么办

java程序可以运行但是会崩溃

错误出现在FindDate.java文件的136行,其中调用了FindData.setDate_menu函数,出入了空值,不在你显示的代码中。

成都创新互联2013年开创至今,是专业互联网技术服务公司,拥有项目成都做网站、网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元新密做网站,已为上家服务,为新密各地企业和个人服务,联系电话:028-86922220

让java中写的一个程序崩溃

你是要哪种崩溃啊。

最简单的崩溃:除零、空指针、数组越界,都可以使用程序崩溃

// 空指针崩溃

String s = null;

System.out.println( s.toArray() );    // 随便什么方法都行,选择toArray是因为这个打字少

// 除零崩溃

int b = 0;

int a = 1 / b;

// 数组越界

int [] a = new int[1];

a[15]=0;

如何用java编写代码让java虚拟机崩溃

网上有这样一套编码,能使java虚拟机崩溃:

package jvm;

public class Crash {

public static void main(String[] args) {

//Object[] o = {“abc”};初始值赋值,不会有影响。

Object[] o = null;

while (true) {

o = new Object[] { o };

//输出的话,jvm就不会崩溃。

//System.out.println(o);

}        

}

}

程序运行十几秒之后,控制台会出现这样的错误:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

at jvm.Crash.main(Crash.java:10)

很明显,超出内存空间错误。

我将原程序随意改了一下,如赋初始值等,对程序无影响。

可是我将死循环中的o输出在控制台的时候,jvm居然一直都不崩,为什么输出的话,就不会超出内存空间呢?

我看来,原程序能够使Jvm崩溃,是因为死循环中,通过旧对象,不断创建出新的对象,即创造的对象是互相引用的,所以GC是不会回收它们的,造成堆栈溢出。

仿照这个例子,我写了一个简单的类,模仿例子程序中的数组,如下:

package jvm;

public class MyCrash {

public static void main(String[] args) {

JvmBean j = null;

while(true){

j = new JvmBean(j);

//无论输出不输出,jvm都会崩溃

//System.out.println(j);

}

}

}

结果便是控制台输出如下的错误:

Exception in thread "main" java.lang.StackOverflowError

at jvm.JvmBean.init(JvmBean.java:5)

at jvm.JvmBean.init(JvmBean.java:5)

at jvm.JvmBean.init(JvmBean.java:5)

at jvm.JvmBean.init(JvmBean.java:5)

at jvm.JvmBean.init(JvmBean.java:5)

一长串的"at jvm.JvmBean.init(JvmBean.java:5)",后面的被省略了。

结果看来,同样也造成了jvm崩溃,可是错误类型跟例子程序的不同,说堆栈溢出错误,并且无论是否输出,错误都一样发生,为什么呢?

结论

第一个异常

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at jvm.Crash.main(Crash.java:10)是因为程序无法申请到足够的内存的时候抛出的异常,Object数组o不断指向新的Object数组,数组元素是原来的Object数组,这使得Object维数越来越高。不断申请内存空间,最终导致超出jvm中堆的最大值。堆内存溢出。为什么输出打印,时间会延长呢?!输出打印的话,虚拟机并不是不会崩溃,而是崩溃的时间大大延长了。而崩溃时间延长其实是假象,是因为输出属于IO事件,每次输出CPU都被中断,IO很耗时,所以,感觉上才会时间延长。

第二个异常

”类内部的静态属性 静态块 对象属性 构造方法。注意这一点,那就是说 bean属性会先于JvmBean的构造函数被初始化。在main函数中,new一个 JvmBean的构造函数之前,类内部的JvmBean对象要优先被初始化,这个类内部的属性bean的内部同样也包含了一个JvmBean对象需要被初始化,成循环调用,造 成了栈溢出。”所以异常才会是这个——Exception in thread "main" java.lang.StackOverflowError


网站栏目:程序崩溃的java代码,代码崩溃怎么办
分享URL:http://cqcxhl.cn/article/dscpogh.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP