Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int
:
int x;
x = 10;
В этом примере переменная x является int
, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.
Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:
Integer num;
num = new Integer(10);
Первая строка объявляет переменную с именем num
, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer
является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».
Во второй строке ключевое слово new
используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num
присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования .
(точка).
Exception
, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num
. Перед созданием объекта вы получите NullPointerException
. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.
Например, вы можете имеют следующий метод:
public void doSomething(SomeObject obj) {
//do something to obj
}
В этом случае вы не создаете объект obj
, скорее предполагая, что он был создан до вызова метода doSomething
. К сожалению, этот метод можно вызвать следующим образом:
doSomething(null);
В этом случае obj
имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException
, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.
Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething
может быть записано как:
/**
* @param obj An optional foo for ____. May be null, in which case
* the result will be ____.
*/
public void doSomething(SomeObject obj) {
if(obj != null) {
//do something
} else {
//do something else
}
}
Наконец, Как определить исключение & amp; причина использования Трассировки стека
Один из способов, который я нашел, - создать цветную карту, а затем проецировать ее на полярную ось. Вот рабочий пример - он включает в себя неприятный взлом, хотя (четко прокомментированный). Я уверен, что есть способ либо отрегулировать ограничения, либо (сложнее) написать свой собственный Transform
, чтобы обойти его, но я еще совсем не справился с этим. Я думал, что ограничения на вызов Normalize
будут делать это, но, по-видимому, нет.
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
import matplotlib as mpl
fig = plt.figure()
display_axes = fig.add_axes([0.1,0.1,0.8,0.8], projection='polar')
display_axes._direction = 2*np.pi ## This is a nasty hack - using the hidden field to
## multiply the values such that 1 become 2*pi
## this field is supposed to take values 1 or -1 only!!
norm = mpl.colors.Normalize(0.0, 2*np.pi)
# Plot the colorbar onto the polar axis
# note - use orientation horizontal so that the gradient goes around
# the wheel rather than centre out
quant_steps = 2056
cb = mpl.colorbar.ColorbarBase(display_axes, cmap=cm.get_cmap('hsv',quant_steps),
norm=norm,
orientation='horizontal')
# aesthetics - get rid of border and axis labels
cb.outline.set_visible(False)
display_axes.set_axis_off()
plt.show() # Replace with plt.savefig if you want to save a file
Это приводит к
Если вы хотите кольцо, а не колесо, используйте его до plt.show()
или plt.savefig
display_axes.set_rlim([-1,1])
. Это дает
В соответствии с @EelkeSpaak в комментариях - если вы сохраняете графику как SVG в соответствии с OP, вот подсказка для работы с полученным графиком: Маленькие элементы результирующее изображение SVG касаются и не перекрываются. Это приводит к слабым серым линиям в некоторых рендерах (Inkscape, Adobe Reader, возможно, не в печати). Простым решением этого является применение небольшого (например, 120%) масштабирования для каждого из отдельных элементов градиента, используя, например, Inkscape или Illustrator. Обратите внимание, что вам придется применять преобразование к каждому элементу отдельно (указанное программное обеспечение предоставляет функциональные возможности для этого автоматически), а не всего чертежа, в противном случае он не имеет эффекта.
Мне просто нужно было сделать цветовое колесо и решил обновить решение rsnape для совместимости с matplotlib 2.1. Вместо того, чтобы помещать объект цветной панели на ось, вы можете вместо этого построить полярную цветную сетку на полярном графике.
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
import matplotlib as mpl
#If displaying in a Jupyter notebook:
%matplotlib inline
#Generate a figure with a polar projection
fg = plt.figure(figsize=(8,8))
ax = fg.add_axes([0.1,0.1,0.8,0.8], projection='polar')
#define colormap normalization for 0 to 2*pi
norm = mpl.colors.Normalize(0, 2*np.pi)
#Plot a color mesh on the polar plot
#with the color set by the angle
n = 200 #the number of secants for the mesh
t = np.linspace(0,2*np.pi,n) #theta values
r = np.linspace(.6,1,2) #raidus values change 0.6 to 0 for full circle
rg, tg = np.meshgrid(r,t) #create a r,theta meshgrid
c = tg #define color values as theta value
im = ax.pcolormesh(t, r, c.T,norm=norm) #plot the colormesh on axis with colormap
ax.set_yticklabels([]) #turn of radial tick labels (yticks)
ax.tick_params(pad=15,labelsize=24) #cosmetic changes to tick labels
ax.spines['polar'].set_visible(False) #turn off the axis spine.
Он дает следующее:
[/g0]
ColorbarBase
, но пропустил ключевое словоorientation
. Это решение, безусловно, лучше, чем мое собственное (поскольку «спицы» на колесе теперь больше не перекрываются), но это все еще не совсем то решение, которое я хотел, так как в результате векторного искусства все еще имеется много отдельных элементов пути, а не один Безье -круглый круг. Большое спасибо в любом случае; если никто не придет с решением true i>, я помечаю ваш ответ как принятый :) – EelkeSpaak 11 August 2015 в 13:27