相信在编写java的代码过程中,我们经常会碰到这样一个问题:明明代码的语法没有错误,运行过程中也没有报错,但为什么总是实现不了自己想要的功能呢?其实,这是常见的逻辑错误。我在初学的时候也是如此,但我慢慢学会使用“步骤跟踪法”即在恰当的位置使用打印输出语句来验证,就像《洋葱》这首歌里写的:“如果你愿意一层一层地剥开我的心。”这样就能找出错误,下面我就介绍给同样初学的大家。

下面来看两个例子:

public class drawPixelwyh {

public static void main(String[] args){

drawPixelwyh ui=new drawPixelwyh();

ui.showUI();

}

public void showUI(){

//其他代码省略...

//窗体:默认边框布局

JFrame jf=new JFrame();

Graphics g=jf.getGraphics();//画笔

jf.setVisible(true);

PixelMouse mouse=new PixelMouse();

mouse.gr=g;

}

}

public class PixelMouse implements MouseListener,ActionListener{

//全局变量:属性

public Graphics gr;  //保存传递过来的画笔对象

gr.drawImage(bufferImage, 40, 90,1080,540, null);

这个错误是非常常见的空指针错误。我们先按下解决方法不谈,先按照一步步来检验错误(运行时错误出现在代码最后一行)。

①bufferImage这里不可能错误,因为就算这里是空对象系统也是不会报错的,而只有在调用空对象(gr)的方法时才会出错。

②因此,我们在报错的前一行使用打印语句: System.out.println("gr:"+gr);这时会输出:gr:null。这样就验证了我们的想法是正确的。

③然后我们再在mouse.gr=g;前写一行打印语句System.out.println("传入前的g:"+g);这时会输出:传入前的g:null。这样就说明了我们在传入前的画笔g就已经是空对象了。

④然后我们再检查这一行前面的代码,发现是Graphics g=jf.getGraphics();和jf.setVisible(true);这两行的位置弄反了,因为获取画笔必须在窗体可见之后,这时我们就知道如何修改了。

或许这个错误比较显而易见,但对初学者的我们来说这种解决问题的思路是非常重要的,这样不仅可以解决问题,更重要的是能再一次理清自己编写代码时的逻辑。

再来看一个例子:

public class Threadop extends Thread{

public Graphics gr;

public int op;

public BufferedImage bufferImage;

public Pixel pixel = new Pixel();

public String name; //区分不同处理效果

public Threadop(Graphics g){

this.gr=g;

System.out.println("创建线程对象");

}

public void setop(int op){

this.op=op;

}

public void setPixelName(String n) {

name = n;

}

public void run(){

Webcam webcam = Webcam.getDefault();

webcam.open();

while(true){

bufferImage=webcam.getImage();

//System.out.println("进入while循环:"+name);

System.out.println("gr="+gr);

gr.drawImage(bufferImage, 300, 150, 540, 540, null);

}

}

}

public class PixelMouse implements MouseListener,ActionListener{

public Threadop tr=new Threadop(gr);

public void actionPerformed(ActionEvent e){

name = e.getActionCommand();

if("打开摄像头".equals(name)){

tr.start();

System.out.println(tr+"  op  "+tr.op);

}

}

}

public class drawPixelwyh {

public static void main(String[] args){

drawPixelwyh ui=new drawPixelwyh();

ui.showUI();

}

public void showUI(){

//其他代码省略...

//窗体:默认边框布局

JFrame jf=new JFrame();

jf.setVisible(true);

Graphics g=jf.getGraphics();//画笔

PixelMouse mouse=new PixelMouse();

System.out.println("开始传画笔");

mouse.gr=g;

}

}

在这里同样会报空指针错误(nullpointerexception),同时错误出现在“gr.drawImage(bufferImage, 300, 150, 540, 540, null);”这一行。我们从上个例子类似可知,只有调用空对象的方法系统才会报错,但我们明明在创建线程类的构造方法中把PixelMouse中的画笔传过去了,而PixelMouse中的gr也已经在drawPixel的showUI()方法中的mouse.gr=g;语句中绑定在窗体的画笔上了,这是怎么回事呢?想要解决这个问题,同样需要用到步骤跟踪法,下面是具体步骤:

①我们在线程类中的run方法出错前一行打印画笔:System.out.println("gr="+gr);这时输出gr=null;符合我们的猜想。

②我们在线程类的构造方法中打印输出语句:System.out.println("创建线程对象");同时在showUI方法的

mouse.gr=g;前使用打印语句:System.out.println("开始传画笔");这时输出结果:创建线程对象 开始传画笔。因此我们要注意这个问题:类在运行过程中,首先是实现其具有的属性(PixelMouse中的tr这个线程对象),再实现其拥有的方法(drawPixel中的mouse.gr=g,这个方法不同于一般明显写出的方法),所以我们在构造方法中想将画笔传过去是不可行的,因为此时窗体上的画笔还没有获取,自然tr中的画笔就是空的了。

③因此我们可以这样改正:写构造方法时并不需要传画笔,而是在PixelMouse中的actionPerformed方法里加tr.gr=gr;语句来传画笔 ,这样就可以避免这个问题,同时也不要忘记创建线程对象tr时不需要参数gr。

总结:

通过这两个例子,我们初学者不仅可以学会如何自己寻找错误,也可以理清自己编写程序时的逻辑,希望这个方法能给大家一些帮助!

【JAVA】一种寻找错误的方法相关推荐

  1. java telephony jar_编译错误解决方法

    首页板块列表刷机技术阅读帖子 编译错误解决方法 发布时间:2015-05-19 18:153回复.2072阅读 前言:关于Android4.4/CM11编译中遇到的一些错误,本人进行了整理.有需要的童 ...

  2. java五种遍历HashMap的方法和性能分析

    在本文中,我们将通过示例讨论在 Java 上遍历 HashMap 的五种最佳方法. 使用Iterator迭代 使用 For-each + entrySet 循环遍历 HashMap 使用 For-ea ...

  3. Java几种遍历集合的方法(原理,复杂度,适用场合)

    目录 1. 顺序存储和链式存储 1.1 顺序存储 1.2 链式存储 1.3 区别 2. Java常用的遍历方式 2.1 for循环遍历 2.2 Iterator迭代器 2.3 foreach循环 3. ...

  4. 使用ZjDroid时出现了R.java不存在的错误解决方法

    ZjDroid是什么? 请看这篇文章: Android动态逆向分析工具ZjDroid--脱壳神器 今天第一次使用这个的时候出现了下图所示的错误: 提示:import com.android.rever ...

  5. JAVA四种遍历Map的方法

    导入java.util.hashmap: 导入java.util.iterator: 导入java.util.map: 导入java.util.set: 公共类映射{ 公共静态void main(st ...

  6. java 四种实现延迟加载的方法

    1. 延迟初始化 2. 虚拟代理(virtual proxy) 原文地址:   http://www.oodesign.com/proxy-pattern.html Intent The intent ...

  7. Java三种嵌入jsp的方法

    一.表达式标签<%=   %> 作用:1.计算表达式的值 <%=1+1%> 2.在页面显示表达式的值 <%=pageContext.getAttribute(" ...

  8. java mail 554_【Java】JavaMail 554错误解决方法

    退信代码说明: •421 HL:REP 该IP发送行为异常,存在接收者大量不存在情况,被临时禁止连接.请检查是否有用户发送病毒或者垃圾邮件,并核对发送列表有效性: •421 HL:ICC 该IP同时并 ...

  9. 干货| 8种寻找数据集的方法

    欢迎关注微信公众号[计算机视觉联盟] 获取更多前沿AI.CV资讯 就目前来看,找到一个特定的数据集来解决各种机器学习问题,甚至进行实验还是比较困难的. 本文作者Will Badr便列举了八大机器学习数 ...

最新文章

  1. iOS解决键盘阻挡输入框
  2. bzoj4385 POJ2015 Wilcze doły
  3. KDD Cup 2021:时间序列异常检测问题开源方案
  4. python中定义的函数不掉用不会执行_如果出现异常/错误,如何不在python中停止执行其他函数...
  5. Vue013_ vue组件化编码
  6. ArchiMate - 发布【企业架构语言ArchiMate v0.5.pdf】
  7. vue-cli 体验
  8. “移动媒体产品”的三个方向
  9. speedoffice(Excel)如何隐藏编辑栏
  10. 《Java程序设计》实验指导——项目3 类与对象
  11. 微信小程序---实现VR看房效果
  12. JavaScript中的Map、Set及其遍历
  13. 数据可视化----常用图表样式
  14. [VCS]filelist.list的做法
  15. 超全Python 量化金融库汇总,必看
  16. 国际网页短信后台定制源码搭建软件平台定制-移讯云短信系统
  17. C语言结构体的1字节对齐(代码实现)
  18. 钢铁企业如何分步实施信息化
  19. End-to-End Object Detection with Transformers[DETR]
  20. 点亮LED灯的三种形式

热门文章

  1. win7网络里的计算机,win7看不到局域网计算机怎么办
  2. 如何用python画出自己喜欢的表情包
  3. Ordering类-greatestOf
  4. F004-兰博基尼工程师得花多少年才能买一辆Lamborghini #F650
  5. 今年很火的AI绘画怎么玩
  6. java笔试常见填空题
  7. pc端双六边形重叠效果(带边框的六边形)
  8. 外行朋友值得一读的5本经典数学书
  9. Java实现JWS生成与验签
  10. 数据中台,我还能爱你吗(文末送书)