【问题标题】:Java 2D NullPointerExceptionJava 2D NullPointerException
【发布时间】:2013-10-13 06:29:41
【问题描述】:

最近我开始编写一些 Java 2D 代码。

我做了这个:

    public void paintComponent(Graphics comp) {
         Graphics2D comp2D = (Graphics2D) comp;
         Font fontx = new Font("Verdana", Font.BOLD, 5);
         comp2D.setFont(fontx);
         comp2D.drawString("Hello World!", 5, 50);
}  

我确实导入了 JFrame 和 java.awt.*,但还是有问题。

当我运行它时,我得到了这个:

    Exception in thread "main" java.lang.NullPointerException
    at game.Game.paintComponent(Game.java:41) - comp2D.setFont(fontx); - Sets Font
    at game.Game.next(Game.java:36) - paintComponent(null); - calls the paintComponent public void from the next() public void
    at game.Game.main(Game.java:26) - next.next(); - calls a public void called "next" using an object called "next" (this public void throws InterruptedException)
Java Result: 1

我该如何解决?

【问题讨论】:

  • 与任何 NPE 一样,关键信息是引发异常的行。那么,哪一行会抛出你的 NPE (NullPointerException)?
  • 我该如何解决? 1. 调试您的代码或 2. 发布 SSCCE,简短、可运行、compilabel 生成上午异常
  • 使用特定行更新了 OP。请再次检查。
  • 您是否手动调用paintComponent?听起来你在 paintComponent 方法上做错了什么。
  • 我用“paintComponent(null);”来称呼它从下一个()公共无效。

标签: java swing import jframe 2d


【解决方案1】:

你说:

Exception in thread "main" java.lang.NullPointerException
at game.Game.paintComponent(Game.java:41) -  
    comp2D.setFont(fontx); - Sets Font

这意味着 comp2D 为 null 并且您正在尝试对 null 变量调用方法。

at game.Game.next(Game.java:36) - paintComponent(null); 
     - calls the paintComponent public void from the next() public void

这意味着你是直接调用paintComponent并传入null!

所以你直接调用paintComponent并传入null!如果您尝试对其调用方法,Graphics 对象为 null 并且会引发 NPE,这不足为奇。

解决方案:

  • 你几乎从不直接调用paintComponent。
  • 而是让 JVM 在您调用 repaint() 时调用它。 JVM 将传入一个有效的 Graphics 对象。
  • 最重要的——阅读painting with Swing tutorial。您无法猜测这些东西并期望它会起作用。
  • 确保您的 paintComponent 方法保存在 JPanel 或其他 JComponent 派生组件中。
  • 使用paintComponent 的@Override 注释确保您的覆盖有效。
  • 不要忽略在您的覆盖中调用 super.paintComponent(...) 方法。
  • 例如,让您的其他方法更改一个类字段,比如说让它更改一个名为 text 的字符串字段,然后调用 repaint(),然后让您的 paintComponent(...) 方法使用文本字段来打印要在面板。这只是一个例子。您可以更改任何绘图组件的字段,然后在 paintComponent(...) 中使用它们。

【讨论】:

  • 我不是在猜测,我实际上是从我正在学习的书中复制的。那么我应该如何调用 public void paintComponent() 呢?我必须从另一个公共空间调用它......
  • @BarSharabani:你的书实际上让你打电话给paintComponent(null)?真的吗?如果是这样,请摆脱那本书,而是从我链接到的教程开始。不,如果你编码正确,你实际上不必从另一个方法调用它。严重地。您更改类的状态,调用 repaint() 并让 JVM 调用该方法。请阅读我提供的教程链接。再说一次,把你的书扔掉,因为如果它建议直接调用该方法,那它就毫无价值了。
  • 不,这是 NetBeans 建议做的事情,因为当我尝试做 paintComponent() 时它不起作用。添加空值时它没有显示错误。我对这个主题特别陌生,但对 Java 不是。
  • 好的,谢谢,我会使用你链接的教程。
  • @BarSharabani:请参阅我的解决方案列表中的新点以获取“更改班级状态”的示例。
猜你喜欢
  • 2021-07-06
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 2016-04-08
  • 2013-11-08
  • 2013-02-16
相关资源
最近更新 更多