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

原创 2017年01月03日 01:15:24
大家都知道在非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)
    接下来就看不懂了,首先每行的括号里面的+号是什么意思,此外+号后面的数字并不是抛出异常的位置在源文件中的准确行数。请大家给予解答。


非常重要——SDK调试技巧.pdf

  • 2017年09月04日 21:40
  • 211KB
  • 下载

很多.net 程序员不知道又非常重要的 .net高级调试技巧.调试别人的dll方法内的变量.

事情是这样的, 最近需要开发Orcale的数据库. 于是使用了EF 加上 Oracle.ManagedDataAccess.Client这个Oracle.ManagedDataAccess 很好用,...
  • phker
  • phker
  • 2017年11月18日 17:38
  • 53

java语言中解决一些安全问题的技巧(安全编程非常重要标签)

对付高严重性暴露的技巧 请遵循下列建议以避免高严重性静态安全性暴露: 限制对变量的访问 让每个类和方法都成为 final,除非有足够的理由不这样做 不要依赖包作用域 使类不可克隆 ...

oralce查询效率提升方面的一些技巧信息(数据库优化非常重要标签)

在一个数据库中进行操作的时候,效率是很重要的,那么,如何提高oracle的查询效率呢?笔者将从以下几个方面进行详细解析:          1、选择最有效率的表名顺序(只在基于规则的优化器中有效)...

MCU非常重要的通信接口--UART的调试

1,在CubeMX中的配置步骤 (1)RCC  打开HSE 外设的时钟配置,HCLK = 72MHZ (2)USART1 异步收发 以上配置完成,生成keil工程的代码...

极品PPT制作教程非常重要.ppt

  • 2013年11月29日 18:23
  • 7.18MB
  • 下载

用RVM安装ruby on rails开发环境,实践+全面(非常重要)

安装ruby on rails的开发环境要用到RVM代理,是很方便的,但是我们经常会失败,因为在教程里面往往会忽略一个问题,就是让我们设置终端。下面是给自己的提醒,这样设置后后面的找装就会顺利得多。 ...

极品PPT制作教程非常重要

  • 2012年12月23日 15:33
  • 7.18MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【调试中非常重要的技巧】如何从错误堆栈的输出判断程序出错的准确位置?
举报原因:
原因补充:

(最多只允许输入30个字)