Это проблема, вызванная затенением переменных. В классе у вас есть поле stati c:
public static X509Certificate newCert;
Однако в блоке try у вас есть следующая строка:
X509Certificate newCert = (X509Certificate) certs[0];
newCert
в блоке try не то же самое, что newCert
, определенное на уровне класса. newCert
в блоке try эффективно скрывает или затеняет newCert
, объявленный на уровне класса. Затем вы выходите из блока try, в результате чего newCert
, определенный в нем, становится go вне области видимости. Тогда вы return newCert
, но это newCert
- это поле класса stati c. Концептуально он инициализируется нулевым значением во время загрузки класса, и вы никогда не меняете его, поэтому, когда вы его вернете, вы получите null.
Не совсем понятно, что вы пытаетесь сделать здесь с дизайном класса, но я ' Предположим, вы Java новичок и изо всех сил пытаетесь выучить основы. Есть два простых решения. Первый - оставить объявление внутри блока try. Поэтому замените указанную выше строку на
newCert = (X509Certificate) certs[0];
Вторая - полностью избавиться от поля класса и просто вернуть newCert
из блока try. В качестве альтернативы вы можете объявить newCert
чуть выше и за пределами блока try и иметь единую точку выхода.
Хороший дизайн класса - это, конечно, более крупный и фундаментальный topi c, а у меня нет обратился к нему в этом ответе. Я просто предложил несколько быстрых исправлений.
Спасибо Maarten Bodewes за то, что он привел меня к ошибке.