iT邦幫忙

1

JAVA抓不到值

  • 分享至 

  • twitterImage

大家好,來請教各位
我要撈資料庫畫一個長條圖
SQL連線OK
長條圖顯示OK
但從SQL抓資料顯示到長條圖中(X)
都會跟我說
http://ithelp.ithome.com.tw/upload/images/20170817/20102983zJ2WsBtFX7.jpg
我試著要把值抓出來但都失敗.....
以下程式碼

@ManagedBean
public class ChartView implements Serializable {
 private BarChartModel barModel;
    private HorizontalBarChartModel horizontalBarModel;
  public int a[];
 public int b[];
 public int i=0;
/*
set/get
*/
    @PostConstruct
    public void init() {
        createBarModels();
    }
 private void createBarModels() {
        createBarModel();   
    }
     private void createBarModel() {
        barModel = initBarModel();          
        Axis xAxis = barModel.getAxis(AxisType.X);      
        Axis yAxis = barModel.getAxis(AxisType.Y); 
        yAxis.setMin(0);
        yAxis.setMax(200);
    }
    private BarChartModel initBarModel() {
        BarChartModel model = new BarChartModel();
        ChartSeries boys = new ChartSeries();
  for(int j=0;j<a.length;j++)
  {
      boys.set(a[j], b[j]);//畫長條圖
  }
        model.addSeries(boys); 
        return model;
    }
     
    public List<Purtxt> getPurData()
    {
        List<Purtxt> purlist=new LinkedList<Purtxt>();
        try
        {
         Class.forName("oracle.jdbc.driver.OracleDriver");
         Connection con=DriverManager.getConnection(....);      
      Statement st=con.createStatement();
       System.out.println(st);      
         ResultSet rs=st.executeQuery(
        "select pmn20,pmn31 from pmn_file where pmn31>0 and rownum<10"); 
         
     while(rs.next())
            { 
       a[i]=rs.getInt("pmn31");
       b[i]=rs.getInt("pmn20");//存SQL數據
       /*問題主要在這裡,想把值放進去,但發現他放不進去.....
        a[i],b[i]依舊是空值
        我有試著將a[i],b[i]直接存入數字(不使用SQL)她就可以顯示.....
        求把rs.getInt("pmn31")值存入a[i]的方法...感謝
       */
       i++;
            }
            rs.close();
            st.close();
            con.close();
        }
        //catch.....
        return purlist;
    }
 
}

感謝

fillano iT邦超人 1 級 ‧ 2017-08-17 17:09:37 檢舉
幫你把錯誤訊息翻成英文:
An error occurred performing resource injection on managed bean

用這個應該比較好google問題。
神威 iT邦研究生 4 級 ‧ 2017-08-17 17:35:33 檢舉
fillano
我知道我現在的問題點就是
a[i]=rs.getInt("pmn31");
想把值放進去卻放不進去
我試過將陣列初始化a[i]={0}
他就會顯示圖表了
但我想顯示的是SQL的資料......
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
bizpro
iT邦大師 1 級 ‧ 2017-08-17 19:32:53
最佳解答

如果你要使用int[], 就必須要先分配固定的記憶體空間(分配記憶體並非初始化), 假設各分配10個int:

public int a[]=new int[10];
public int b[]=new int[10];

但是, 你面對的可能是不一定長度的資料庫資料, 建議您使用List, Map,..., 例如,

List<Integer> a = new ArrayList<Integer>();
List<Integer> b = new ArrayList<Integer>();
然後
a.add(rs.getInt("pmn31"));
b.add(rs.getInt("pmn20"));
看更多先前的回應...收起先前的回應...
bizpro iT邦大師 1 級 ‧ 2017-08-17 21:26:20 檢舉

"我試過將陣列初始化a[i]={0}"
{0}的大括號等於是記憶體分配(new), 而且初始化a[0]為0

神威 iT邦研究生 4 級 ‧ 2017-08-18 08:39:16 檢舉

bizpro你好
試了您的方法,發現還是無法傳值......

.......
private BarChartModel initBarModel() {
        BarChartModel model = new BarChartModel();
        getPurData();
        ChartSeries boys = new ChartSeries();
        boys.setLabel("Boys");
	for(int j=0;j<a.length;j++)
	{
	    boys.set(c.get(j), d.get(j));
	      
	}
        model.addSeries(boys); 
        return model;
    }
    public List<Purtxt> getPurData()
    {
        List<Purtxt> purlist=new LinkedList<Purtxt>();
        try
        {
        //connect sql
 ResultSet rs=st.executeQuery(
"select pmn20,pmn31 from pmn_file where pmn31>0 and rownum<10  ");               
	   for(i=0;i<10;i++)
            {rs.next();
            Purtxt e=new Purtxt();  
		 purlist.add(e);
		c.add(rs.getInt("pmn31"));
       d.add(rs.getInt("pmn20"));
		//我值放進去他還是無法顯示...
        e.setCoun(rs.getInt("pmn31"));**
        //一定要這樣才能顯示到網頁,但這樣只能用table方式呈現
        無法畫長條圖.......
            }
           //connect close
        }
bizpro iT邦大師 1 級 ‧ 2017-08-18 12:44:32 檢舉

您有配置記憶體給c和d嗎?

List<Integer> c = new ArrayList<Integer>()
List<Integer> d = new ArrayList<Integer>()
fillano iT邦超人 1 級 ‧ 2017-08-18 14:04:30 檢舉

如果你讀長條圖資料非得用int[],那再把c跟d轉回來就好了啊?

神威 iT邦研究生 4 級 ‧ 2017-08-18 14:55:20 檢舉

bizpro

這樣可以嗎?

 public int a[]=new int[10];
 public int b[]=new int[10];
 List<Integer> c = new ArrayList<Integer>(10);
List<Integer> d = new ArrayList<Integer>(10);
神威 iT邦研究生 4 級 ‧ 2017-08-18 14:58:31 檢舉

fillano
那個....

List<Integer> c = new ArrayList<Integer>(10); 

這樣不就是int的一種嗎?

bizpro iT邦大師 1 級 ‧ 2017-08-18 15:01:58 檢舉

之前只有a和b, 現在多出c和d...
如果您要配置記憶體給int[] a和b, 需設定固定數量的記憶體空間:

public int a[]=new int[10];
public int b[]=new int[10];

如果您要配置記憶體給ArrayList c和d, 不需設定固定數量的記憶體空間:

List<Integer> c = new ArrayList<Integer>();
List<Integer> d = new ArrayList<Integer>();
神威 iT邦研究生 4 級 ‧ 2017-08-18 15:12:42 檢舉

bizpro
現在有畫出東西了,謝謝
想問一下
那這樣我一定要先規定陣列大小
那如果我每天的資料量不一樣
(例如推出新產品,10樣變12樣)
是不是就只能自己改a[10]==>a[12]阿
還是我可以自動偵測資料庫的筆數去畫

bizpro iT邦大師 1 級 ‧ 2017-08-18 16:37:46 檢舉

所以我才建議要用不固定長度的ArrayList<Integer>, 而不是固定長度的int[]

神威 iT邦研究生 4 級 ‧ 2017-08-18 16:56:02 檢舉

bizpro

List<Integer> c = new ArrayList<Integer>();
List<Integer> d = new ArrayList<Integer>();
//draw chart
.....
  ChartSeries boys = new ChartSeries();
        boys.setLabel("Boys");
	for(int j=0;j<a.length;j++)
	{
	    //boys.set(a[j], b[j]);
	     boys.set(c.get(j), d.get(j));
	}
    .....
    c.add(rs.getInt("pmn31"));
     d.add(rs.getInt("pmn20"));//store data

結果圖就出不來了.......
請問我有那裡沒寫到嗎?謝謝

bizpro iT邦大師 1 級 ‧ 2017-08-18 21:14:45 檢舉

可以不用ArrayList, int[],...:

ChartSeries boys = new ChartSeries();
boys.setLabel("Boys");
while(rs.next())
{ 
  boys.set(new Integer(rs.getInt("pmn31")).toString, new Integer(rs.getInt("pmn20")));
}
rs.close();
st.close();
con.close();

如果您要先取值給ArrayList以供後續利用, 也可:

//先取值:
//...資料庫ResultSet操作...
ArrayList<String> pmn31 = new ArrayList<String>();
ArrayList<Integer> pmn20 = new ArrayList<Integer>();
while(rs.next())
{ 
  pmn31.add(new Integer(rs.getInt("pmn31")).toString());
  pmn20.add(new Integer(rs.getInt("pmn20")));
}
rs.close();
st.close();
con.close();
//...
//之後利用:
ChartSeries boys = new ChartSeries();
boys.setLabel("Boys");
for (int i = 0; i < pmn31.size(); i++) {
  boys.set(pmn31.get(i), pmn20.get(i));
}

以上程式碼只做描述用. 請自行除錯.

神威 iT邦研究生 4 級 ‧ 2017-08-21 16:57:18 檢舉

bizpro
OK啦!!
感謝大大

我要發表回答

立即登入回答