站内搜索: 请输入搜索关键词

当前页面: JAVA 编程资料牛鼻论坛Java 手机开发技术→【调试中非常重要的技巧】如何从错误堆栈的输出判断程序出错的准确位置?

【调试中非常重要的技巧】如何从错误堆栈的输出判断程序出错的准确位置?

发表新主题   回复此主题

第1楼 2004-03-31 14:01 patricc 写道:

【调试中非常重要的技巧】如何从错误堆栈的输出判断程序出错的准确位置?

大家都知道在非J2ME程序中,捕捉异常后用ex.printStackTrace()可以得到错误堆栈,错误堆栈中除了有错误信息(原因)外,还有抛出异常的位置在源文件的行数,从而可以准确地定位错误。 但是在J2ME程序中,用ex.printStackTrace()输出的信息似乎并不是抛出异常的位置在源文件的准确行数,现在有一个简单示例如下: 类MIDletTest2.java: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.io.*; public class MIDletTest2 extends MIDlet { MyCanvas myCan; public MIDletTest2() { myCan = new MyCanvas(); } protected void pauseApp() { } protected void startApp() { Display.getDisplay(this).setCurrent(myCan); } protected void destroyApp(boolean parm1) { } } 类MyCanvas.java: import javax.microedition.lcdui.*; public class MyCanvas extends Canvas { Image img; public MyCanvas() { } protected void paint(Graphics g) { try { img = Image.createImage("/err/err.png");//抛出异常的地方 } catch (Exception ex) { ex.printStackTrace(); } g.drawImage(img, 0, 0, g.TOP|g.LEFT); } } err.png是不存在的文件,很明显当首次调用paint时,会因为找不到图片文件而抛出异常,下面看抛出异常的错误堆栈信息: java.io.IOException: Couldn't find resource at javax.microedition.lcdui.Image.(+36) at javax.microedition.lcdui.Image.createImage(+8) at MyCanvas.paint(+6) at javax.microedition.lcdui.Canvas.paint(+149) at javax.microedition.lcdui.Canvas.serviceRepaints(+8) at javax.microedition.lcdui.Canvas.handleShown(+42) at javax.microedition.lcdui.Canvas.handleCurrent(+26) at javax.microedition.lcdui.Display.setCurrent(+81) at MIDletTest2.startApp(+11) at javax.microedition.midlet.MIDletInvoker.invokeStartApp(+4) at com.symbian.midp.compatibility.runtime.MIDletScheduler.startMIDlet(+29) at com.symbian.midp.compatibility.runtime.MultiMIDletScheduler.run(+17) 接下来就看不懂了,首先每行的括号里面的+号是什么意思,此外+号后面的数字并不是抛出异常的位置在源文件中的准确行数。请大家给予解答。

第2楼 2013-08-31 12:44 Robot :

【调试中非常重要的技巧】如何从错误堆栈的输出判断程序出错的准确位置? 相关


第3楼 2004-04-02 12:29 patricc 写道:

这应该不是那么难的问题吧

第4楼 2004-04-04 00:55 lazybone 写道:

我认为是经编译后的文件在解释运行时出错的地方,所以有的时候很准,有的时候因为有循环等等重复而造成数字比较大

第5楼 2004-04-04 01:05 lazybone 写道:

就比如说 1 int[] i =new int[5];//(0-4) 2 int j; 3 for(j=1;j<=5;j++) 4 { i[j]=j;} 当程序运行到j=5的时候,就会抛出越界异常 循环作了5次,所以出错的地方大概是<5*n+x>n是多少我还没研究过……x是一个未知数……大概和循环内容有关。

第6楼 2005-04-21 16:46 tfosorcim 写道:


还是让我给你解答吧

第7楼 2005-05-22 13:31 6001983 写道:

楼上的  你的解答呢
我编译的时候也经常出现这种问题
我想看一下你的解答

发表新主题   回复此主题