Эта строка вашего кода ...
frame.setVisible(true);
вызывает ваш метод paint(Graphics g)
, который вызывает NullPointerException
, так как на этом этапе член array
класса VisMain
по-прежнему равен нулю (согласно опубликованному вами коду).
Следовательно, вам необходимо присвоить значение array
перед тем, как вызовет frame.setVisible(true)
.
Приведенный ниже код работает для меня, т. Е. Нет NullPointerException
с использованием JDK 12.0.1 в Windows 10. Это в основном код, который вы опубликовали. Единственная часть, которую я изменил, была в методе main()
, но для полноты я публикую весь код, который вы опубликовали, включая мои изменения, чтобы вы могли скопировать / вставить его.
package guitests;
import java.awt.Canvas;
import java.awt.Graphics;
import javax.swing.JFrame;
public class VisMain extends Canvas {
private static final long serialVersionUID = 1L;
private int[] array;
public static void bubble_srt(int array[]) {
int n = array.length;
int k;
for (int m = n; m >= 0; m--) {
for (int i = 0; i < n - 1; i++) {
k = i + 1;
if (array[i] > array[k]) {
swapNumbers(i, k, array);
}
}
}
}
private static void swapNumbers(int i, int j, int[] column) {
int temp;
temp = column[i];
column[i] = column[j];
column[j] = temp;
VisMain set = new VisMain();
set.arraySetter(column);
}
public void arraySetter(int[] list) {
this.array = list;
repaint();
}
/* Only this method is changed from original code posted by DeusDeus. */
public static void main(String[] args) {
JFrame frame = new JFrame("My Drawing");
int[] input = {4, 2, 5, 6, 33, 15, 34, 0, 1, 99};
VisMain obj = new VisMain();
obj.arraySetter(input);
obj.setSize(400, 400);
frame.add(obj);
frame.pack();
frame.setVisible(true);
bubble_srt(input);
}
public void paint(Graphics g) {
for (int i = 0; i < array.length; i++) {
g.drawRect((i + 1) * 60, 100, 50, array[i]);
}
}
}