Чистый ответ - потратить немного времени на правильную подготовку среды выполнения.
Первым методом, который вы должны подготовить среду исполнения, является использование файла matplotlibrc
, как разумно рекомендованный Крисом К. , установив
backend : Agg
в этом файле. Вы можете даже контролировать - без изменений кода - , как и где ищет matplotlib, и находит файл matplotlibrc
.
Второй метод, который вы должны подготовить для своей среды выполнения, - это используйте переменную среды MPLBACKEND
(и сообщите своим пользователям об использовании):
export MPLBACKEND="agg"
python
Это удобно, потому что вам даже не нужно предоставлять другой файл на диске, чтобы сделать эту работу. Я использовал этот подход, например, для тестирования в непрерывной интеграции и для работы на удаленных компьютерах, которые не имеют дисплеев.
Жесткое кодирование вашего backplan matplotlib для «Agg» в вашем коде на Python похоже на избиение квадратный колышек в круглое отверстие с большим молотком, когда вместо этого вы могли просто сказать matplotlib, что это должно быть квадратное отверстие.
Условием для hasArray
является
(hb != null) && !isReadOnly
isReadOnly
, если вы, например, используете asReadOnlyBuffer
CharBuffer.allocate(20).asReadOnlyBuffer();
.
Так что да, нам это нужно.
Возьмите эту строку
final CharBuffer cb = instance.getCharBuffer(...);
Это только для чтения или нет? Содержит ли он действительный массив char[]
? Мы действительно не знаем. Если мы сделаем
cb.array();
и это буфер только для чтения, мы получим ReadOnlyBufferException
.
Если он не поддерживается массивом char[]
, мы получаем UnsupportedOperationException
.
Итак, что мы могли бы сделать, это
if (cb.hasArray()) {
final char[] arr = cb.array();
}
Теперь мы находимся Exception
в безопасности.
Также вы можете быть уверены, что инженеры Oracle / OpenJDK / whatJDK знают, что они делают;)