Почему NullPointerException, при попытке вызвать поток?

320
21 ноября 2017, 21:25

Я создал отдельный класс потока, который должен рисовать некоторый текст в окне.

class MyThreads extends Thread  {
    Authorization reglog;
    Graphics g;
    Dimension dim;
    public MyThreads(SimpleWind draw){
            g = draw.getGraphics();
            dim = draw.getSize();
        }
    public void run(){
        for(int i = 0;;i++){
        String result = null;
        boolean resultOfAuthorization = reglog.getResultOfAuthorization();
        if(resultOfAuthorization==true){
            result = "Succesfully entered";
        }
        if(resultOfAuthorization== false){
            result = "You are not entered yet.";
        }
        g.drawString(result, i, 50);
            try {
                this.sleep(100);
            } catch (InterruptedException ex) {
            }
        }
    }
}

И запускаю поток в другом классе

SimpleWind s = new SimpleWind(this);
thread = new MyThreads(s);
thread.start();

Но выбивает ошибку

Exception in thread "Thread-2" java.lang.NullPointerException

В классе SimpleWind я создаю Canvas, на котором рисую.

Код класса SimpleWind:

import java.applet.Applet;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Container;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Scanner;

/**
 *
 * @author fuji
 */
class SimpleWind extends Canvas {
    SimpleWind th;
    LABA_3 var;
    Applet obj;
    MyThreads win;
    Calculations calcul;
    int x0, y0;
    Graphics gr = getGraphics();
    public static int clickeddots[][] = new int[10][2];
    public static int numberofclicks = 0;
    public SimpleWind(LABA_3 obj)
    {
        repaint();
        var = obj;
        this.addMouseListener(new MouseAdapter(){
                    public void mousePressed(MouseEvent me)
        {
            x0=me.getX();
            y0=me.getY();
            clickeddots[numberofclicks][0] = x0;
            clickeddots[numberofclicks][1]=y0;
            Graphics gr = getGraphics();
            numberofclicks++;
            gr.setColor(Color.RED);
            gr.drawOval(x0-10, y0-10, 2*10, 2*10);
            findcoords(x0, y0);
        }
        });
    }
   public void choosepicture(int numberofpicture, SimpleWind s){
       Graphics g = getGraphics();
       Image myImg;
       if(numberofpicture == 0){
        myImg= Toolkit.getDefaultToolkit().getImage("picture1.jpg");   
        g.drawImage(myImg, 0, 0, getSize().width,getSize().height,this);     
       }
       if(numberofpicture == 1){
        myImg= Toolkit.getDefaultToolkit().getImage("Smilik.png");   
        g.drawImage(myImg, 0, 0, getSize().width,getSize().height,this);  
       }
   }
        public void drawCircleByCenter( int x, int y, int radius){
                //g.setColor(Color.LIGHT_GRAY);
                Graphics g = getGraphics();
                g.fillOval(x-radius, y-radius, 2*radius, 2*radius);
         }
                 public void findcoords(int x0, int y0)
    {
     int varx, vary;
        int flag1 = 0, flag2 =0;
        for(int i = 0; i<calcul.n; i++)
        {
            for (int j = -10; j < 10; j++)
        {
                        varx=x0;
            varx=varx-j;
            if (varx == calcul.Array[i][0]) 
            {
                flag1 = 1;
            }
        }
        for (int z = -10; z < 10; z++)
        {
            vary = y0;
                        vary = vary-z;
            if (vary == calcul.Array[i][1]) 
            {
                flag2 = 1;
            }
        }
                if(flag1 == 1 && flag2 == 1)// ???
                {
                    System.out.println("The coords you've input are in the radius of " + calcul.Array[i][0]+" " +calcul.Array[i][1]);
                }
                flag1 = 0;
                flag2 = 0;
    }
    }
    public void paint(Graphics g) {  
                choosepicture(var.n, th);
                drawCoord(g);
                char a[] = {'.'};
                int fontSize = 20;
                g.setFont(new Font("TimesRoman", Font.PLAIN, fontSize));
                g.setColor(Color.black);
        }       

        public void drawCoord(Graphics g){ 
            char a[] = {'.'};
            for(int i = 0; i<calcul.n; i++)
            {
                g.drawChars(a, 0, a.length, calcul.Array[i][0], calcul.Array[i][1]);
                drawCircleByCenter( calcul.Array[i][0], calcul.Array[i][1], 10);
            }
        }
}
Answer 1

Я так понимаю, исключение на этой строке boolean resultOfAuthorization = reglog.getResultOfAuthorization();?

Вы переменную reglog не инициализировали. У вас там null.

UPD: насколько я помню, Canvas из awt может на getGraphics() возвращать null, если элемент ещё не был отрендерен.

Читаем официальные доки, в частности этот урок. Рекомендуется рисовать в переопределённом методе paintComponent.

READ ALSO
Logger и Log в Android

Logger и Log в Android

В библиотеке https://githubcom/kochedykov/jlibmodbus/blob/master/src/com/invertor/modbus/Modbus

244
Как сделать плавное движение строки по Canvas?

Как сделать плавное движение строки по Canvas?

Я написал отдельный класс потока, в котором двигаю строку по канвасуИ проблема в том, что если я делаю

233
файл занят другим процессом Commons FileUpload Java

файл занят другим процессом Commons FileUpload Java

Либа commons fileuploadЕсть код для загрузки файлов:

245