【问题标题】:Java Error to do with array searching与数组搜索有关的 Java 错误
【发布时间】:2011-08-23 10:59:06
【问题描述】:

大家好,我正在尝试使用 drawString() 函数从数组中的搜索中绘制结果。我正在使用下面的代码

import java.awt.Graphics;

public class canvas extends JPanel{
    int i, count;
    public String read_string = "";
    public String[] names = {"Duncan","Matthew","Kevin","Etc"};
    public String[] searchfor = {"Duncan","Kevin"};
    public canvas() {

    search();


    }

    public void search() {

        for(i=0; i<names.length; i++) {
            read_string = names[i];
            if(read_string.contains("Duncan") || read_string.contains("Kevin")) {

                count++;

                System.out.println(read_string);
                drawThatText(null, read_string, 500*i + 1, 500*i + 1);
            } else {

            }


        }
    }


    public void drawThatText(Graphics g, String s, int x, int y) {


        g.drawString(s, x, y);

    }
}

我收到以下错误

Duncan
java.lang.ExceptionInInitializerError
Caused by: java.lang.ArithmeticException: / by zero
    at canvas.search(canvas.java:33)
    at canvas.<init>(canvas.java:19)
    at Client.<clinit>(Client.java:10)
Exception in thread "main" 

【问题讨论】:

  • g 为空,这段代码是如何工作的?
  • " drawThatText(read_string, 500*i + 1, 500*i + 1);"是第 33 行
  • @Duncan,该行不可能生成除以零异常。您的代码和错误不“匹配”。

标签: java arrays swing


【解决方案1】:

drawThatText(read_string, 500*i + 1, 500*i + 1); 是第 33 行

该行不可能抛出除以零异常。

不过,我确实看到你可以得到NullPointerException,因为你打电话

drawThatText(null, ...

然后做

public void drawThatText(Graphics g, String s, int x, int y) {
                         ^^^^^^^^^^^
                       will equal null

    g.drawString(s, x, y);
    ^
    |
    '--- Will throw a NullPointerException

}

这是一个不同版本的程序,它应该可以帮助你朝着正确的方向前进:

import java.awt.Graphics;
import javax.swing.*;
public class canvas extends JPanel {
    int i, count;
    public String read_string = "";
    public String[] names = {"Duncan","Matthew","Kevin","Etc"};
    public String[] searchfor = {"Duncan","Kevin"};

    @Override
    public void paintComponent(Graphics g) {
        for(i=0; i<names.length; i++) {
            read_string = names[i];
            if(read_string.contains("Duncan") ||
               read_string.contains("Kevin")) {
                count++;
                System.out.println(read_string);
                drawThatText(g, read_string, 50*i + 10, 50*i + 10);
            }
        }
    }

    public void drawThatText(Graphics g, String s, int x, int y) {
        g.drawString(s, x, y);
    }

    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.setContentPane(new canvas());
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setSize(200, 200);
        jf.setVisible(true);
    }
}

【讨论】:

  • 那么我怎样才能让它不抛出 NullPointerException 呢?
  • 您应该使用系统传递给您的Graphics 对象。创建组件后,您不会“绘制组件”,而是在系统决定需要绘制它时绘制它(调用paintComponent),然后使用该方法调用中提供的Graphics 对象绘制它。
【解决方案2】:

您将一个 null Graphic 对象传递给 drawThatText()。

编辑:

您最终应该从您想要绘制的Component 中检索 Graphic 对象。使用这个方法:

yourComponent.getGraphics(); //where yourComponent is the component you want do draw on.

【讨论】:

  • 不解释除以零
  • 我是java新手,有没有办法解决这个问题?
  • @tulskiy:你是对的。反正我看不到任何分裂。也许他没有发布整个代码。反正这也是个问题。
猜你喜欢
  • 2018-06-13
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多