【调试中非常重要的技巧】如何从错误堆栈的输出判断程序出错的准确位置?
2017-01-03 01:15
465 查看
大家都知道在非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.<init>(+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)
接下来就看不懂了,首先每行的括号里面的+号是什么意思,此外+号后面的数字并不是抛出异常的位置在源文件中的准确行数。请大家给予解答。
但是在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.<init>(+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)
接下来就看不懂了,首先每行的括号里面的+号是什么意思,此外+号后面的数字并不是抛出异常的位置在源文件中的准确行数。请大家给予解答。
相关文章推荐
- DNN调试利器DNNDebug.aspx--如何调试出错信息不具体的程序错误
- [调试技巧] 如何利用WinDbg找出程序崩溃的位置
- DNN调试利器DNNDebug.aspx--如何调试出错信息不具体的程序错误
- 解决vc++DEBUG ERROR问题前几天师弟调试程序的时候出现了这样一个错误,出错的位置是在delete [] 一个动态分配的数组时出现的。 经过调查发现错误是因为他之前在给数组赋值的时候越界了
- # include <errno.h >查看错误代码errno是调试程序的一个重要方法。当Linux C API函数发生异常时,一般会将errno变量赋值一个整数,不同的值表示不同的含义,可以通过查看
- 在windows下如何定位错误输出位置
- 调试技巧 —— 如何利用windbg + dump + map分析程序异常
- [remote debug]WinDBG 技巧: 如何用WinDBG远程调试程序
- WinDBG 技巧: 如何用WinDBG远程调试程序
- 调试技巧 —— 如何利用windbg + dump + map分析程序异常
- 调试技巧 —— 如何利用windbg + dump + map分析程序异常
- VS2005开发常见错误及解决(1)VS2005调试程序出错,绑定句柄无效 Terminal Services
- 调试技巧;程序错误类型。
- 开发常见错误解决(3)VS2005调试程序出错,绑定句柄无效 Terminal Services
- 用GDB调试程序---转贴,非常全面的调试技巧
- Oracle出错:由于输出设备已满或不可用, 归档程序无法归档重做日志。归档日志错误!
- WinDBG 技巧: 如何用WinDBG远程调试程序
- 有一个队列 ABCDEFG, 现有一个堆栈, 有三种操作, 出队, 入栈,出栈. 输出可以是出队操作也可以是出栈操作.试问如何判断某一序列不是无法输出的?
- 调试技巧 —— 如何利用windbg + dump + map分析程序异常
- 调试技巧 —— 如何利用windbg + dump + map分析程序异常