2016-01-26 7 views
2

Я пишу небольшой код, который использует потоки для доступа к матрицам U, S и V из матрицы A, используя метод Jama и svd(), но мне приходится сталкиваться с такими трудностями, как Java Null pointer исключение. Мой код заключается в следующем:svd error java java null Указатель исключения

public class SVD implements Runnable 
    { 
    private Thread t; 
    public Matrix A; 
    public int option; 
    public Matrix result; 

    public SVD(Matrix A, int optiune) 
    { 
     this.A = A; 
     this.option = optiune; 
    } 

    @Override 
    public void run() 
    { 
     if (option == 1) 
      result = A.svd().getU(); 
     if(option ==2) 
      result=A.svd().getS(); 
     if(option ==3) 
      result=A.svd().getV(); 
    } 

    public void start() 
    { 
     if (t == null) 
     { 
      t = new Thread(this); 
      t.start(); 
     } 

    } 

} 

Теперь, когда я пытаюсь создать 3 SVD объекты, как это:

Matrix A = Matrix.random(20, 20); 
    SVD a1 = new SVD(A, 1); 
    SVD a2 = new SVD(A, 2); 
    SVD a3 = new SVD(A, 3); 
    a1.start(); 
    a2.start(); 
    a3.start(); 
    Matrix U=a1.result; 

Последняя строка является строкой, которая получает ошибку. Что может вызвать проблему? Это то, чего я пропустил?

PS: Извините за форматирование, я не знаю, почему это так!

+2

'NullPointerException' вызывается при вызове метода на объекте' null'. Попробуйте 'System.out.println (a1);' перед вашей ошибочной строкой. – AMACB

+0

Это печать [email protected], поэтому объект указывает на что-то! Я думаю, что есть что-то с результатом Matrix, но я не понимаю, что кажется проблемой. –

+0

Хм, это странно. Вы уверены, что на эту строку выдается ошибка. – AMACB

ответ

0

результат от типа матрицы, хотя ваш a1 указывает на то, a1.result может быть пустым, попробуйте вызвать метод выполнения, прежде чем делать свою последнюю линию, что-то вроде:

Matrix A = Matrix.random(20, 20); 
SVD a1 = new SVD(A, 1); 
SVD a2 = new SVD(A, 2); 
SVD a3 = new SVD(A, 3); 
a1.start(); 
a2.start(); 
a3.start(); 
a1.run(); 
Matrix U=a1.result; 

Проверьте линию a1.run(), то есть для инициализации поля результата из a1.

+0

Это работает! Но почему, запуск метода не следует называть неявным путем start()? –

+0

Нет, потому что в вашем методе запуска вы не выполняете вызов метода run, если это то, что вам нужно, тогда вы должны поместить вызов этого метода внутри начала. – Dazak

+0

Я использовал ваш метод, но возникает другая проблема: я потерял Согласитесь, код уже не параллелен! –

Смежные вопросы